X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu-defer.c;h=e71b0cf7c1dd6c4f8eaef6b185b485a4797edf0e;hb=812cadd78037278561f699aedc71c4429af67b0c;hp=13f94fa0f05b05833152265da9147bdb456e88b6;hpb=04eb9c4f11a43e4cd7307d319b2d5f7624cd2801;p=urcu.git diff --git a/urcu-defer.c b/urcu-defer.c index 13f94fa..e71b0cf 100644 --- a/urcu-defer.c +++ b/urcu-defer.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -38,6 +37,8 @@ #include "urcu-defer.h" #define futex(...) syscall(__NR_futex, __VA_ARGS__) +#define FUTEX_WAIT 0 +#define FUTEX_WAKE 1 void __attribute__((destructor)) urcu_defer_exit(void); @@ -110,9 +111,9 @@ static void internal_urcu_unlock(pthread_mutex_t *mutex) */ static void wake_up_defer(void) { - if (unlikely(atomic_read(&defer_thread_futex) == -1)) { - atomic_set(&defer_thread_futex, 0); - futex(&defer_thread_futex, FUTEX_WAKE, 0, + if (unlikely(uatomic_read(&defer_thread_futex) == -1)) { + uatomic_set(&defer_thread_futex, 0); + futex(&defer_thread_futex, FUTEX_WAKE, 1, NULL, NULL, 0); } } @@ -136,15 +137,15 @@ static unsigned long rcu_defer_num_callbacks(void) */ static void wait_defer(void) { - atomic_dec(&defer_thread_futex); + uatomic_dec(&defer_thread_futex); smp_mb(); /* Write futex before read queue */ if (rcu_defer_num_callbacks()) { smp_mb(); /* Read queue before write futex */ /* Callbacks are queued, don't wait. */ - atomic_set(&defer_thread_futex, 0); + uatomic_set(&defer_thread_futex, 0); } else { smp_rmb(); /* Read queue before read futex */ - if (atomic_read(&defer_thread_futex) == -1) + if (uatomic_read(&defer_thread_futex) == -1) futex(&defer_thread_futex, FUTEX_WAIT, -1, NULL, NULL, 0); }