SUBDIRS = . tests
include_HEADERS = urcu.h urcu-bp.h urcu-call-rcu.h urcu-defer.h \
- urcu-pointer.h urcu-qsbr.h
+ urcu-pointer.h urcu-qsbr.h urcu-flavor.h
nobase_dist_include_HEADERS = urcu/compiler.h urcu/hlist.h urcu/list.h \
urcu/rculist.h urcu/rcuhlist.h urcu/system.h urcu/futex.h \
urcu/uatomic/generic.h urcu/arch/generic.h urcu/wfstack.h \
urcu/wfqueue.h urcu/rculfstack.h urcu/rculfqueue.h \
urcu/ref.h urcu/map/*.h urcu/static/*.h urcu/cds.h \
- urcu/urcu_ref.h urcu/urcu-futex.h urcu/uatomic_arch.h
+ urcu/urcu_ref.h urcu/urcu-futex.h urcu/uatomic_arch.h \
+ urcu/rculfhash.h
nobase_nodist_include_HEADERS = urcu/arch.h urcu/uatomic.h urcu/config.h
EXTRA_DIST = $(top_srcdir)/urcu/arch/*.h $(top_srcdir)/urcu/uatomic/*.h \
gpl-2.0.txt lgpl-2.1.txt lgpl-relicensing.txt \
README LICENSE compat_arch_x86.c \
urcu-call-rcu-impl.h urcu-defer-impl.h \
- ChangeLog API.txt
+ rculfhash-internal.h \
+ ChangeLog API.txt \
+ $(top_srcdir)/tests/*.sh
if COMPAT_ARCH
COMPAT=compat_arch_@ARCHTYPE@.c
COMPAT+=compat_futex.c
endif
+RCULFHASH = rculfhash.c rculfhash-mm-order.c rculfhash-mm-chunk.c \
+ rculfhash-mm-mmap.c
+
lib_LTLIBRARIES = liburcu-common.la \
liburcu.la liburcu-qsbr.la \
liburcu-mb.la liburcu-signal.la liburcu-bp.la \
liburcu_bp_la_SOURCES = urcu-bp.c urcu-pointer.c $(COMPAT)
liburcu_bp_la_LIBADD = liburcu-common.la
-liburcu_cds_la_SOURCES = rculfqueue.c rculfstack.c $(COMPAT)
+liburcu_cds_la_SOURCES = rculfqueue.c rculfstack.c $(RCULFHASH) $(COMPAT)
liburcu_cds_la_LIBADD = liburcu-common.la
pkgconfigdir = $(libdir)/pkgconfig
assert(!ret);
}
+ void *rcu_dereference_sym_bp(void *p)
+ {
+ return _rcu_dereference(p);
+ }
+
+ void *rcu_set_pointer_sym_bp(void **p, void *v)
+ {
+ cmm_wmb();
+ return uatomic_set(p, v);
+ }
+
+ void *rcu_xchg_pointer_sym_bp(void **p, void *v)
+ {
+ cmm_wmb();
+ return uatomic_xchg(p, v);
+ }
+
+ void *rcu_cmpxchg_pointer_sym_bp(void **p, void *old, void *_new)
+ {
+ cmm_wmb();
+ return uatomic_cmpxchg(p, old, _new);
+ }
+
+DEFINE_RCU_FLAVOR()
+
#include "urcu-call-rcu-impl.h"
#include "urcu-defer-impl.h"
#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
* 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 */
/*
* See LGPL-only urcu/static/urcu-pointer.h for documentation.
*/
- extern void rcu_read_lock(void);
- extern void rcu_read_unlock(void);
+ extern void rcu_read_lock(void)
+ __attribute__((weak));
+ extern void rcu_read_unlock(void)
+ __attribute__((weak));
+
+ extern void *rcu_dereference_sym_bp(void *p)
+ __attribute__((weak));
+ #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)
+ __attribute__((weak));
+ #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)
+ __attribute__((weak));
+ #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)
+ __attribute__((weak));
+ #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 */
#include <urcu-call-rcu.h>
#include <urcu-defer.h>
+#include <urcu-flavor.h>
#endif /* _URCU_BP_H */