Fix: compat_futex should work-around futex signal-restart kernel bug
[urcu.git] / urcu / futex.h
index 13d2b1a0a9c73904563e2b9b46d40d19e3316686..0486ff6a1830f174d7471164a282507a6d1f756c 100644 (file)
@@ -28,7 +28,7 @@
 
 #ifdef __cplusplus
 extern "C" {
-#endif 
+#endif
 
 #define FUTEX_WAIT             0
 #define FUTEX_WAKE             1
@@ -57,7 +57,7 @@ extern int compat_futex_async(int32_t *uaddr, int op, int32_t val,
 #include <unistd.h>
 #include <errno.h>
 #include <urcu/compiler.h>
-#include <urcu/syscall-compat.h>
+#include <urcu/arch.h>
 
 static inline int futex(int32_t *uaddr, int op, int32_t val,
                const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
@@ -73,7 +73,16 @@ static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
 
        ret = futex(uaddr, op, val, timeout, uaddr2, val3);
        if (caa_unlikely(ret < 0 && errno == ENOSYS)) {
-               return compat_futex_noasync(uaddr, op, val, timeout,
+               /*
+                * The fallback on ENOSYS is the async-safe version of
+                * the compat futex implementation, because the
+                * async-safe compat implementation allows being used
+                * concurrently with calls to futex(). Indeed, sys_futex
+                * FUTEX_WAIT, on some architectures (mips and parisc),
+                * within a given process, spuriously return ENOSYS due
+                * to signal restart bugs on some kernel versions.
+                */
+               return compat_futex_async(uaddr, op, val, timeout,
                                uaddr2, val3);
        }
        return ret;
@@ -109,7 +118,7 @@ static inline int futex_async(int32_t *uaddr, int op, int32_t val,
 
 #endif
 
-#ifdef __cplusplus 
+#ifdef __cplusplus
 }
 #endif
 
This page took 0.02315 seconds and 4 git commands to generate.