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>
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
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;