Fix: handle sys_futex() FUTEX_WAIT interrupted by signal
[urcu.git] / urcu / futex.h
index 69f8961dafca35ad3d67f514600c4f9600074b07..2be3bb6c1dc96e5ee71d932f9a2ae7f5221d901b 100644 (file)
@@ -6,6 +6,8 @@
  *
  * Userspace RCU - sys_futex/compat_futex header.
  *
+ * Copyright 2011-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
@@ -22,6 +24,7 @@
  */
 
 #include <urcu/config.h>
+#include <stdint.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -39,22 +42,25 @@ extern "C" {
  *
  * futex_async is signal-handler safe for the wakeup. It uses polling
  * on the wait-side in compatibility mode.
+ *
+ * BEWARE: sys_futex() FUTEX_WAIT may return early if interrupted
+ * (returns EINTR).
  */
 
 #ifdef CONFIG_RCU_HAVE_FUTEX
-#include <sys/syscall.h>
+#include <urcu/syscall-compat.h>
 #define futex(...)     syscall(__NR_futex, __VA_ARGS__)
 #define futex_noasync(uaddr, op, val, timeout, uaddr2, val3)   \
                futex(uaddr, op, val, timeout, uaddr2, val3)
 #define futex_async(uaddr, op, val, timeout, uaddr2, val3)     \
                futex(uaddr, op, val, timeout, uaddr2, val3)
 #else
-extern int compat_futex_noasync(int *uaddr, int op, int val,
-       const struct timespec *timeout, int *uaddr2, int val3);
+extern int compat_futex_noasync(int32_t *uaddr, int op, int32_t val,
+       const struct timespec *timeout, int32_t *uaddr2, int32_t val3);
 #define futex_noasync(uaddr, op, val, timeout, uaddr2, val3)   \
                compat_futex_noasync(uaddr, op, val, timeout, uaddr2, val3)
-extern int compat_futex_async(int *uaddr, int op, int val,
-       const struct timespec *timeout, int *uaddr2, int val3);
+extern int compat_futex_async(int32_t *uaddr, int op, int32_t val,
+       const struct timespec *timeout, int32_t *uaddr2, int32_t val3);
 #define futex_async(uaddr, op, val, timeout, uaddr2, val3)     \
                compat_futex_async(uaddr, op, val, timeout, uaddr2, val3)
 #endif
This page took 0.023506 seconds and 4 git commands to generate.