X-Git-Url: https://git.lttng.org/?p=urcu.git;a=blobdiff_plain;f=urcu.c;h=1d5c06f53c565af243fb45c5e47c1ebb609dff97;hp=da6839f0c25b88b4262e9a615bd197220789c185;hb=8fd9af4adc59c8a0d6bcea7c286c4e0cae7138b9;hpb=ed1b099ef8acd1396dbde7c7150d1a5eb16ce8a6 diff --git a/urcu.c b/urcu.c index da6839f..1d5c06f 100644 --- a/urcu.c +++ b/urcu.c @@ -62,6 +62,24 @@ */ #define RCU_QS_ACTIVE_ATTEMPTS 100 +/* + * RCU_MEMBARRIER is only possibly available on Linux. + */ +#if defined(RCU_MEMBARRIER) && defined(__linux__) +#include +#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_EXPEDITED (1 << 0) +#define MEMBARRIER_DELAYED (1 << 1) +#define MEMBARRIER_QUERY (1 << 16) + #ifdef RCU_MEMBARRIER static int init_done; int rcu_has_sys_membarrier; @@ -83,7 +101,7 @@ void __attribute__((destructor)) rcu_exit(void); #endif static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER; -struct urcu_gp rcu_gp = { .ctr = RCU_GP_COUNT }; +struct rcu_gp rcu_gp = { .ctr = RCU_GP_COUNT }; /* * Written to only by each individual reader. Read by both the reader and the @@ -139,7 +157,7 @@ static void mutex_unlock(pthread_mutex_t *mutex) static void smp_mb_master(int group) { if (caa_likely(rcu_has_sys_membarrier)) - membarrier(MEMBARRIER_EXPEDITED); + (void) membarrier(MEMBARRIER_EXPEDITED); else cmm_smp_mb(); }