X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=compat_futex.c;h=a3571343ca37d086e77620da1ed0dd5e9fd71778;hp=6ec0b3912b34afbda58c873371f83aec55d35f68;hb=b0a841b4ff807dd29fe0cdbfe24900312f0e627b;hpb=f4fe930941ad7e73ca2064c8be1abc31626ec50b diff --git a/compat_futex.c b/compat_futex.c index 6ec0b39..a357134 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, gret = 0; + int ret; /* * Check if NULL. Don't let users expect that they are taken into @@ -70,7 +70,11 @@ int compat_futex_noasync(int32_t *uaddr, int op, int32_t val, cmm_smp_mb(); ret = pthread_mutex_lock(&__urcu_compat_futex_lock); - assert(!ret); + if (ret) { + errno = ret; + ret = -1; + goto end; + } switch (op) { case FUTEX_WAIT: /* @@ -91,11 +95,16 @@ int compat_futex_noasync(int32_t *uaddr, int op, int32_t val, pthread_cond_broadcast(&__urcu_compat_futex_cond); break; default: - gret = -EINVAL; + errno = EINVAL; + ret = -1; } ret = pthread_mutex_unlock(&__urcu_compat_futex_lock); - assert(!ret); - return gret; + if (ret) { + errno = ret; + ret = -1; + } +end: + return ret; } /* @@ -107,6 +116,8 @@ int compat_futex_noasync(int32_t *uaddr, int op, int32_t val, int compat_futex_async(int32_t *uaddr, int op, int32_t val, const struct timespec *timeout, int32_t *uaddr2, int32_t val3) { + int ret = 0; + /* * Check if NULL. Don't let users expect that they are taken into * account. @@ -122,13 +133,20 @@ int compat_futex_async(int32_t *uaddr, int op, int32_t val, switch (op) { case FUTEX_WAIT: - while (CMM_LOAD_SHARED(*uaddr) == val) - poll(NULL, 0, 10); + while (CMM_LOAD_SHARED(*uaddr) == val) { + if (poll(NULL, 0, 10) < 0) { + ret = -1; + /* Keep poll errno. Caller handles EINTR. */ + goto end; + } + } break; case FUTEX_WAKE: break; default: - return -EINVAL; + errno = EINVAL; + ret = -1; } - return 0; +end: + return ret; }