Add rcu_read_ongoing() API to each urcu flavor
[urcu.git] / urcu / map / urcu.h
index b55e304afe60af9933992b3e6be11a3ba96ac7c2..becc6a0f438a4eda367e3f779885a633534bdc71 100644 (file)
 /* 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 <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
@@ -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
 #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)
 
 #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 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
 #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)
 
 #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 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
 #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
 
This page took 0.024624 seconds and 4 git commands to generate.