X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fmap%2Furcu.h;h=becc6a0f438a4eda367e3f779885a633534bdc71;hp=b55e304afe60af9933992b3e6be11a3ba96ac7c2;hb=882f335739b978d1c55be2faeed077f315afe5d7;hpb=57760d447eaed07f8a9c6552b8cefc6223ac1158 diff --git a/urcu/map/urcu.h b/urcu/map/urcu.h index b55e304..becc6a0 100644 --- a/urcu/map/urcu.h +++ b/urcu/map/urcu.h @@ -35,15 +35,42 @@ /* Mapping macros to allow multiple flavors in a single binary. */ #if !defined(RCU_MEMBARRIER) && !defined(RCU_SIGNAL) && !defined(RCU_MB) +#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 #define _rcu_read_lock _rcu_read_lock_memb #define rcu_read_unlock rcu_read_unlock_memb #define _rcu_read_unlock _rcu_read_unlock_memb +#define rcu_read_ongoing rcu_read_ongoing_memb +#define _rcu_read_ongoing _rcu_read_ongoing_memb #define rcu_register_thread rcu_register_thread_memb #define rcu_unregister_thread rcu_unregister_thread_memb #define rcu_init rcu_init_memb @@ -51,6 +78,7 @@ #define synchronize_rcu synchronize_rcu_memb #define rcu_reader rcu_reader_memb #define rcu_gp_ctr rcu_gp_ctr_memb +#define rcu_gp_futex rcu_gp_futex_memb #define get_cpu_call_rcu_data get_cpu_call_rcu_data_memb #define get_call_rcu_thread get_call_rcu_thread_memb @@ -63,12 +91,25 @@ #define create_all_cpu_call_rcu_data create_all_cpu_call_rcu_data_memb #define free_all_cpu_call_rcu_data free_all_cpu_call_rcu_data_memb #define call_rcu call_rcu_memb +#define call_rcu_data_free call_rcu_data_free_memb +#define call_rcu_before_fork call_rcu_before_fork_memb +#define call_rcu_after_fork_parent call_rcu_after_fork_parent_memb +#define call_rcu_after_fork_child call_rcu_after_fork_child_memb #define defer_rcu defer_rcu_memb #define rcu_defer_register_thread rcu_defer_register_thread_memb #define rcu_defer_unregister_thread rcu_defer_unregister_thread_memb #define rcu_defer_barrier rcu_defer_barrier_memb #define rcu_defer_barrier_thread rcu_defer_barrier_thread_memb +#define rcu_defer_exit rcu_defer_exit_memb + +#define rcu_flavor rcu_flavor_memb + +#define rcu_yield_active rcu_yield_active_memb +#define rcu_rand_yield rcu_rand_yield_memb + +/* Specific to MEMBARRIER flavor */ +#define rcu_has_sys_membarrier rcu_has_sys_membarrier_memb #elif defined(RCU_SIGNAL) @@ -76,6 +117,8 @@ #define _rcu_read_lock _rcu_read_lock_sig #define rcu_read_unlock rcu_read_unlock_sig #define _rcu_read_unlock _rcu_read_unlock_sig +#define rcu_read_ongoing rcu_read_ongoing_sig +#define _rcu_read_ongoing _rcu_read_ongoing_sig #define rcu_register_thread rcu_register_thread_sig #define rcu_unregister_thread rcu_unregister_thread_sig #define rcu_init rcu_init_sig @@ -83,6 +126,7 @@ #define synchronize_rcu synchronize_rcu_sig #define rcu_reader rcu_reader_sig #define rcu_gp_ctr rcu_gp_ctr_sig +#define rcu_gp_futex rcu_gp_futex_sig #define get_cpu_call_rcu_data get_cpu_call_rcu_data_sig #define get_call_rcu_thread get_call_rcu_thread_sig @@ -95,12 +139,22 @@ #define create_all_cpu_call_rcu_data create_all_cpu_call_rcu_data_sig #define free_all_cpu_call_rcu_data free_all_cpu_call_rcu_data_sig #define call_rcu call_rcu_sig +#define call_rcu_data_free call_rcu_data_free_sig +#define call_rcu_before_fork call_rcu_before_fork_sig +#define call_rcu_after_fork_parent call_rcu_after_fork_parent_sig +#define call_rcu_after_fork_child call_rcu_after_fork_child_sig #define defer_rcu defer_rcu_sig #define rcu_defer_register_thread rcu_defer_register_thread_sig #define rcu_defer_unregister_thread rcu_defer_unregister_thread_sig #define rcu_defer_barrier rcu_defer_barrier_sig #define rcu_defer_barrier_thread rcu_defer_barrier_thread_sig +#define rcu_defer_exit rcu_defer_exit_sig + +#define rcu_flavor rcu_flavor_sig + +#define rcu_yield_active rcu_yield_active_sig +#define rcu_rand_yield rcu_rand_yield_sig #elif defined(RCU_MB) @@ -108,6 +162,8 @@ #define _rcu_read_lock _rcu_read_lock_mb #define rcu_read_unlock rcu_read_unlock_mb #define _rcu_read_unlock _rcu_read_unlock_mb +#define rcu_read_ongoing rcu_read_ongoing_mb +#define _rcu_read_ongoing _rcu_read_ongoing_mb #define rcu_register_thread rcu_register_thread_mb #define rcu_unregister_thread rcu_unregister_thread_mb #define rcu_init rcu_init_mb @@ -115,6 +171,7 @@ #define synchronize_rcu synchronize_rcu_mb #define rcu_reader rcu_reader_mb #define rcu_gp_ctr rcu_gp_ctr_mb +#define rcu_gp_futex rcu_gp_futex_mb #define get_cpu_call_rcu_data get_cpu_call_rcu_data_mb #define get_call_rcu_thread get_call_rcu_thread_mb @@ -127,12 +184,22 @@ #define create_all_cpu_call_rcu_data create_all_cpu_call_rcu_data_mb #define free_all_cpu_call_rcu_data free_all_cpu_call_rcu_data_mb #define call_rcu call_rcu_mb +#define call_rcu_data_free call_rcu_data_free_mb +#define call_rcu_before_fork call_rcu_before_fork_mb +#define call_rcu_after_fork_parent call_rcu_after_fork_parent_mb +#define call_rcu_after_fork_child call_rcu_after_fork_child_mb #define defer_rcu defer_rcu_mb #define rcu_defer_register_thread rcu_defer_register_thread_mb #define rcu_defer_unregister_thread rcu_defer_unregister_thread_mb #define rcu_defer_barrier rcu_defer_barrier_mb #define rcu_defer_barrier_thread rcu_defer_barrier_thread_mb +#define rcu_defer_exit rcu_defer_exit_mb + +#define rcu_flavor rcu_flavor_mb + +#define rcu_yield_active rcu_yield_active_mb +#define rcu_rand_yield rcu_rand_yield_mb #else