#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 <syscall.h>
-
-/* 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
#define rcu_exit rcu_exit_memb
#define synchronize_rcu synchronize_rcu_memb
#define rcu_reader rcu_reader_memb
-#define rcu_gp_ctr rcu_gp_ctr_memb
+#define rcu_gp rcu_gp_memb
#define get_cpu_call_rcu_data get_cpu_call_rcu_data_memb
#define get_call_rcu_thread get_call_rcu_thread_memb
#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)
#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
#define rcu_exit rcu_exit_sig
#define synchronize_rcu synchronize_rcu_sig
#define rcu_reader rcu_reader_sig
-#define rcu_gp_ctr rcu_gp_ctr_sig
+#define rcu_gp rcu_gp_sig
#define get_cpu_call_rcu_data get_cpu_call_rcu_data_sig
#define get_call_rcu_thread get_call_rcu_thread_sig
#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)
#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
#define rcu_exit rcu_exit_mb
#define synchronize_rcu synchronize_rcu_mb
#define rcu_reader rcu_reader_mb
-#define rcu_gp_ctr rcu_gp_ctr_mb
+#define rcu_gp rcu_gp_mb
#define get_cpu_call_rcu_data get_cpu_call_rcu_data_mb
#define get_call_rcu_thread get_call_rcu_thread_mb
#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