urcu: fix compat_futex_noasync()
authorLai Jiangshan <laijs@cn.fujitsu.com>
Thu, 9 Aug 2012 14:19:14 +0000 (10:19 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 9 Aug 2012 14:21:02 +0000 (10:21 -0400)
This patch fix two critical problems in the compatibility fallback of
compact_futex_noasync():

1) compat_futex_cond is not bound to any @uaddr, it services all @uaddr,
   if you wakeup only one thread(pthread_cond_signal), the @uaddr of
   this waking thread and the @uaddr of the woken-up thread may be different.
   The woken-up thread will very probably go to sleep again
   because his own condition is not true.

   *And* this waking thread(FUTEX_WAKE) wake up NOTHING.

2) If the caller want to wake up all waiting threads, he will use INT_MAX
   for @val, and:
                for (i = 0; i < INT_MAX; i++)
                        pthread_cond_signal(&compat_futex_cond);
   becomes almost infinity loop.

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
compat_futex.c

index 04de5965894a7e8317049d9af80e29e36da65f02..bb928e61d6849fc90f63ab5b07fcf82718f28990 100644 (file)
@@ -43,7 +43,7 @@ static pthread_cond_t compat_futex_cond = PTHREAD_COND_INITIALIZER;
 int compat_futex_noasync(int32_t *uaddr, int op, int32_t val,
        const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
 {
-       int ret, i, gret = 0;
+       int ret, gret = 0;
 
        /*
         * Check if NULL. Don't let users expect that they are taken into
@@ -67,8 +67,7 @@ int compat_futex_noasync(int32_t *uaddr, int op, int32_t val,
                pthread_cond_wait(&compat_futex_cond, &compat_futex_lock);
                break;
        case FUTEX_WAKE:
-               for (i = 0; i < val; i++)
-                       pthread_cond_signal(&compat_futex_cond);
+               pthread_cond_broadcast(&compat_futex_cond);
                break;
        default:
                gret = -EINVAL;
This page took 0.026034 seconds and 4 git commands to generate.