#include <string.h>
#include <errno.h>
#include <poll.h>
-#include <linux/futex.h>
#include <sys/time.h>
#include <syscall.h>
#include <unistd.h>
#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);
*/
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);
}
}
*/
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);
}