[lttng-dev] [PATCH] urcu: fix compat_futex_noasync()
Lai Jiangshan
laijs at cn.fujitsu.com
Tue Aug 7 21:20:36 EDT 2012
This patch fix two critical problems:
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 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 at cn.fujitsu.com>
---
diff --git a/compat_futex.c b/compat_futex.c
index 04de596..bb928e6 100644
--- a/compat_futex.c
+++ b/compat_futex.c
@@ -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;
More information about the lttng-dev
mailing list