Fix: compat_futex: uninitialized ret variable
[urcu.git] / urcu.c
diff --git a/urcu.c b/urcu.c
index 6fa9f66d301e96e1ea34b5c96e553841bbd109e7..624d7fcca7ff618279633f66792874649d8b2813 100644 (file)
--- a/urcu.c
+++ b/urcu.c
 #define RCU_QS_ACTIVE_ATTEMPTS 100
 
 /*
- * RCU_MEMBARRIER is only possibly available on Linux.
+ * The ABI of sys_membarrier changed after its original implementation.
+ * Disable it for now. Use RCU_MB flavor instead.
  */
-#if defined(RCU_MEMBARRIER) && defined(__linux__)
-#include <syscall.h>
-#endif
-
-/* If the headers do not support SYS_membarrier, fall back on RCU_MB */
-#ifdef SYS_membarrier
-# define membarrier(...)               syscall(SYS_membarrier, __VA_ARGS__)
-#else
-# define membarrier(...)               -ENOSYS
-#endif
+#define membarrier(...)                -ENOSYS
 
 #define MEMBARRIER_EXPEDITED           (1 << 0)
 #define MEMBARRIER_DELAYED             (1 << 1)
@@ -236,9 +228,22 @@ static void wait_gp(void)
 {
        /* Read reader_gp before read futex */
        smp_mb_master(RCU_MB_GROUP);
-       if (uatomic_read(&rcu_gp.futex) == -1)
-               futex_async(&rcu_gp.futex, FUTEX_WAIT, -1,
-                     NULL, NULL, 0);
+       if (uatomic_read(&rcu_gp.futex) != -1)
+               return;
+       while (futex_async(&rcu_gp.futex, FUTEX_WAIT, -1,
+                       NULL, NULL, 0)) {
+               switch (errno) {
+               case EWOULDBLOCK:
+                       /* Value already changed. */
+                       return;
+               case EINTR:
+                       /* Retry if interrupted by signal. */
+                       break;  /* Get out of switch. */
+               default:
+                       /* Unexpected error. */
+                       urcu_die(errno);
+               }
+       }
 }
 
 /*
This page took 0.023551 seconds and 4 git commands to generate.