Fix: Use proper macro to detect stdbool.h
[urcu.git] / urcu-defer-impl.h
index c762400574cdea19947f0fd265d8c2a4fbb81f6e..f96553365ba4f51035f427798edd2ac4eb981f13 100644 (file)
  * This is required to permit relinking with newer versions of the library.
  */
 
-#ifdef DEBUG_RCU
-#define rcu_assert(args...)    assert(args)
-#else
-#define rcu_assert(args...)
-#endif
-
 /*
  * defer queue.
  * Contains pointers. Encoded to save space when same callback is often used.
@@ -148,7 +142,7 @@ static void mutex_lock_defer(pthread_mutex_t *mutex)
        while ((ret = pthread_mutex_trylock(mutex)) != 0) {
                if (ret != EBUSY && ret != EINTR)
                        urcu_die(ret);
-               poll(NULL,0,10);
+               (void) poll(NULL,0,10);
        }
 #endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
 }
@@ -160,8 +154,9 @@ static void wake_up_defer(void)
 {
        if (caa_unlikely(uatomic_read(&defer_thread_futex) == -1)) {
                uatomic_set(&defer_thread_futex, 0);
-               futex_noasync(&defer_thread_futex, FUTEX_WAKE, 1,
-                     NULL, NULL, 0);
+               if (futex_noasync(&defer_thread_futex, FUTEX_WAKE, 1,
+                               NULL, NULL, 0) < 0)
+                       urcu_die(errno);
        }
 }
 
@@ -198,9 +193,22 @@ static void wait_defer(void)
                uatomic_set(&defer_thread_futex, 0);
        } else {
                cmm_smp_rmb();  /* Read queue before read futex */
-               if (uatomic_read(&defer_thread_futex) == -1)
-                       futex_noasync(&defer_thread_futex, FUTEX_WAIT, -1,
-                             NULL, NULL, 0);
+               if (uatomic_read(&defer_thread_futex) != -1)
+                       return;
+               while (futex_noasync(&defer_thread_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);
+                       }
+               }
        }
 }
 
@@ -373,7 +381,7 @@ static void *thr_defer(void *args)
                 */
                wait_defer();
                /* Sleeping after wait_defer to let many callbacks enqueue */
-               poll(NULL,0,100);       /* wait for 100ms */
+               (void) poll(NULL,0,100);        /* wait for 100ms */
                rcu_defer_barrier();
        }
 
This page took 0.024099 seconds and 4 git commands to generate.