X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fmap%2Furcu.h;h=dd7a6914b93f5c2325dae840824b89d1790b2259;hp=5942fad207102784e0c0f7f14f53734807c1de88;hb=541d828d3101283ccdb1e25fa5a885e1d1743c1a;hpb=34b1b9db1cc283c556af5f35f70ea2e4713a440d diff --git a/urcu/map/urcu.h b/urcu/map/urcu.h index 5942fad..dd7a691 100644 --- a/urcu/map/urcu.h +++ b/urcu/map/urcu.h @@ -38,6 +38,31 @@ #define RCU_MEMBARRIER #endif +/* + * RCU_MEMBARRIER is only possibly available on Linux. Fallback to + * RCU_MB + * otherwise. + */ +#if !defined(__linux__) && defined(RCU_MEMBARRIER) +#undef RCU_MEMBARRIER +#define RCU_MB +#endif + +#ifdef RCU_MEMBARRIER +#include + +/* If the headers do not support SYS_membarrier, statically use RCU_MB */ +#ifdef SYS_membarrier +# define MEMBARRIER_EXPEDITED (1 << 0) +# define MEMBARRIER_DELAYED (1 << 1) +# define MEMBARRIER_QUERY (1 << 16) +# define membarrier(...) syscall(SYS_membarrier, __VA_ARGS__) +#else +# undef RCU_MEMBARRIER +# define RCU_MB +#endif +#endif + #ifdef RCU_MEMBARRIER #define rcu_read_lock rcu_read_lock_memb @@ -70,6 +95,8 @@ #define rcu_defer_barrier rcu_defer_barrier_memb #define rcu_defer_barrier_thread rcu_defer_barrier_thread_memb +#define rcu_flavor rcu_flavor_memb + #elif defined(RCU_SIGNAL) #define rcu_read_lock rcu_read_lock_sig @@ -102,6 +129,8 @@ #define rcu_defer_barrier rcu_defer_barrier_sig #define rcu_defer_barrier_thread rcu_defer_barrier_thread_sig +#define rcu_flavor rcu_flavor_sig + #elif defined(RCU_MB) #define rcu_read_lock rcu_read_lock_mb @@ -134,6 +163,8 @@ #define rcu_defer_barrier rcu_defer_barrier_mb #define rcu_defer_barrier_thread rcu_defer_barrier_thread_mb +#define rcu_flavor rcu_flavor_mb + #else #error "Undefined selection"