#ifdef __cplusplus
extern "C" {
-#endif
+#endif
#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
#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)
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;
#endif
-#ifdef __cplusplus
+#ifdef __cplusplus
}
#endif