X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fmap%2Furcu.h;h=becc6a0f438a4eda367e3f779885a633534bdc71;hp=ea12f346306221e08812e9ad5fd1f2346be619d5;hb=882f335739b978d1c55be2faeed077f315afe5d7;hpb=d4b99c015229978810319cfd42e1c9763772fad8 diff --git a/urcu/map/urcu.h b/urcu/map/urcu.h index ea12f34..becc6a0 100644 --- a/urcu/map/urcu.h +++ b/urcu/map/urcu.h @@ -38,12 +38,39 @@ #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,24 +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 -/* Concurrent Data Structures */ -#define cds_lfq_node_init_rcu cds_lfq_node_init_rcu_memb -#define cds_lfq_init_rcu cds_lfq_init_rcu_memb -#define cds_lfq_destroy_rcu cds_lfq_destroy_rcu_memb -#define cds_lfq_enqueue_rcu cds_lfq_enqueue_rcu_memb -#define cds_lfq_dequeue_rcu cds_lfq_dequeue_rcu_memb +#define rcu_flavor rcu_flavor_memb -#define cds_lfs_node_init_rcu cds_lfs_node_init_rcu_memb -#define cds_lfs_init_rcu cds_lfs_init_rcu_memb -#define cds_lfs_push_rcu cds_lfs_push_rcu_memb -#define cds_lfs_pop_rcu cds_lfs_pop_rcu_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) @@ -88,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 @@ -95,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 @@ -107,24 +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 -/* Concurrent Data Structures */ -#define cds_lfq_node_init_rcu cds_lfq_node_init_rcu_sig -#define cds_lfq_init_rcu cds_lfq_init_rcu_sig -#define cds_lfq_destroy_rcu cds_lfq_destroy_rcu_sig -#define cds_lfq_enqueue_rcu cds_lfq_enqueue_rcu_sig -#define cds_lfq_dequeue_rcu cds_lfq_dequeue_rcu_sig +#define rcu_flavor rcu_flavor_sig -#define cds_lfs_node_init_rcu cds_lfs_node_init_rcu_sig -#define cds_lfs_init_rcu cds_lfs_init_rcu_sig -#define cds_lfs_push_rcu cds_lfs_push_rcu_sig -#define cds_lfs_pop_rcu cds_lfs_pop_rcu_sig +#define rcu_yield_active rcu_yield_active_sig +#define rcu_rand_yield rcu_rand_yield_sig #elif defined(RCU_MB) @@ -132,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 @@ -139,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 @@ -151,24 +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 -/* Concurrent Data Structures */ -#define cds_lfq_node_init_rcu cds_lfq_node_init_rcu_mb -#define cds_lfq_init_rcu cds_lfq_init_rcu_mb -#define cds_lfq_destroy_rcu cds_lfq_destroy_rcu_mb -#define cds_lfq_enqueue_rcu cds_lfq_enqueue_rcu_mb -#define cds_lfq_dequeue_rcu cds_lfq_dequeue_rcu_mb - -#define cds_lfs_node_init_rcu cds_lfs_node_init_rcu_mb -#define cds_lfs_init_rcu cds_lfs_init_rcu_mb -#define cds_lfs_push_rcu cds_lfs_push_rcu_mb -#define cds_lfs_pop_rcu cds_lfs_pop_rcu_mb +#define rcu_yield_active rcu_yield_active_mb +#define rcu_rand_yield rcu_rand_yield_mb #else