#include <stdlib.h>
#include <pthread.h>
-/*
- * See urcu-pointer.h and urcu/static/urcu-pointer.h for pointer
- * publication headers.
- */
-#include <urcu-pointer.h>
-
#ifdef __cplusplus
extern "C" {
#endif
-#include "urcu/map/urcu-bp.h"
+#include <urcu/map/urcu-bp.h>
/*
* Important !
* rcu_unregister_thread() should be called before the thread exits.
*/
+/*
+ * See urcu-pointer.h and urcu/static/urcu-pointer.h for pointer
+ * publication headers.
+ */
+#include <urcu-pointer.h>
+
#ifdef _LGPL_SOURCE
#include <urcu/static/urcu-bp.h>
#define rcu_read_lock_bp _rcu_read_lock
#define rcu_read_unlock_bp _rcu_read_unlock
+#define rcu_dereference_bp rcu_dereference
+#define rcu_cmpxchg_pointer_bp rcu_cmpxchg_pointer
+#define rcu_xchg_pointer_bp rcu_xchg_pointer
+#define rcu_set_pointer_bp rcu_set_pointer
+
#else /* !_LGPL_SOURCE */
/*
extern void rcu_read_lock(void);
extern void rcu_read_unlock(void);
+extern void *rcu_dereference_sym_bp(void *p);
+#define rcu_dereference_bp(p) \
+ ({ \
+ typeof(p) _________p1 = URCU_FORCE_CAST(typeof(p), \
+ rcu_dereference_sym_bp(URCU_FORCE_CAST(void *, p))); \
+ (_________p1); \
+ })
+
+extern void *rcu_cmpxchg_pointer_sym_bp(void **p, void *old, void *_new);
+#define rcu_cmpxchg_pointer_bp(p, old, _new) \
+ ({ \
+ typeof(*(p)) _________pold = (old); \
+ typeof(*(p)) _________pnew = (_new); \
+ typeof(*(p)) _________p1 = URCU_FORCE_CAST(typeof(*(p)), \
+ rcu_cmpxchg_pointer_sym_bp(URCU_FORCE_CAST(void **, p),\
+ _________pold, \
+ _________pnew)); \
+ (_________p1); \
+ })
+
+extern void *rcu_xchg_pointer_sym_bp(void **p, void *v);
+#define rcu_xchg_pointer_bp(p, v) \
+ ({ \
+ typeof(*(p)) _________pv = (v); \
+ typeof(*(p)) _________p1 = URCU_FORCE_CAST(typeof(*(p)), \
+ rcu_xchg_pointer_sym_bp(URCU_FORCE_CAST(void **, p), \
+ _________pv)); \
+ (_________p1); \
+ })
+
+extern void *rcu_set_pointer_sym_bp(void **p, void *v);
+#define rcu_set_pointer_bp(p, v) \
+ ({ \
+ typeof(*(p)) _________pv = (v); \
+ typeof(*(p)) _________p1 = URCU_FORCE_CAST(typeof(*(p)), \
+ rcu_set_pointer_sym_bp(URCU_FORCE_CAST(void **, p), \
+ _________pv)); \
+ (_________p1); \
+ })
+
#endif /* !_LGPL_SOURCE */
extern void synchronize_rcu(void);
{
}
+/*
+ * Q.S. reporting are no-ops for these URCU flavors.
+ */
+static inline void rcu_quiescent_state(void)
+{
+}
+
+static inline void rcu_thread_offline(void)
+{
+}
+
+static inline void rcu_thread_online(void)
+{
+}
+
#ifdef __cplusplus
}
#endif
-#include "urcu-call-rcu.h"
-#include "urcu-defer.h"
+#include <urcu-call-rcu.h>
+#include <urcu-defer.h>
+#include <urcu-flavor.h>
#endif /* _URCU_BP_H */