X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=compat_futex.c;h=dd5bf8a18b574ee06fd50c2d1560eca07dc1e39f;hb=refs%2Fheads%2Fstable-0.8;hp=a3571343ca37d086e77620da1ed0dd5e9fd71778;hpb=52c67a3d6139a6bf56b97ed350c7f3beaef3ce67;p=urcu.git diff --git a/compat_futex.c b/compat_futex.c index a357134..dd5bf8a 100644 --- a/compat_futex.c +++ b/compat_futex.c @@ -54,7 +54,7 @@ pthread_cond_t __urcu_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; + int ret = 0, lockret; /* * Check if NULL. Don't let users expect that they are taken into @@ -69,9 +69,9 @@ int compat_futex_noasync(int32_t *uaddr, int op, int32_t val, */ cmm_smp_mb(); - ret = pthread_mutex_lock(&__urcu_compat_futex_lock); - if (ret) { - errno = ret; + lockret = pthread_mutex_lock(&__urcu_compat_futex_lock); + if (lockret) { + errno = lockret; ret = -1; goto end; } @@ -98,9 +98,9 @@ int compat_futex_noasync(int32_t *uaddr, int op, int32_t val, errno = EINVAL; ret = -1; } - ret = pthread_mutex_unlock(&__urcu_compat_futex_lock); - if (ret) { - errno = ret; + lockret = pthread_mutex_unlock(&__urcu_compat_futex_lock); + if (lockret) { + errno = lockret; ret = -1; } end: @@ -111,6 +111,8 @@ end: * _ASYNC SIGNAL-SAFE_. * For now, timeout, uaddr2 and val3 are unused. * Waiter will busy-loop trying to read the condition. + * It is OK to use compat_futex_async() on a futex address on which + * futex() WAKE operations are also performed. */ int compat_futex_async(int32_t *uaddr, int op, int32_t val,