X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu.c;fp=urcu.c;h=1d5c06f53c565af243fb45c5e47c1ebb609dff97;hp=b3f94da9a2b733e30c08eb014c095933e2e13561;hb=553b7eb9da3a223368abdf3f6a5ead35acf8a20b;hpb=6ed4b2e64c6cef5d6d1a1c1943f29dbf4edf026a diff --git a/urcu.c b/urcu.c index b3f94da..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; @@ -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(); }