[lttng-dev] [PATCH] urcu: fix compat_futex_noasync()
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Thu Aug 9 10:20:48 EDT 2012
* Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
> 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>
Good catch !
Merged, thanks!
Mathieu
> ---
> 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;
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list