From: Mathieu Desnoyers Date: Mon, 5 Dec 2011 23:37:50 +0000 (-0500) Subject: Merge branch 'master' into urcu/ht-shrink X-Git-Tag: v0.7.0~43^2~21 X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=6e464eba97cf74320fe4e2b8da6dbe5039582948;hp=-c Merge branch 'master' into urcu/ht-shrink Conflicts: Makefile.am urcu-bp.c --- 6e464eba97cf74320fe4e2b8da6dbe5039582948 diff --combined Makefile.am index 91a9fd1,a7d3316..e1bf095 --- a/Makefile.am +++ b/Makefile.am @@@ -8,22 -8,21 +8,23 @@@ AM_CFLAGS=-Wal 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 \ + rculfhash-internal.h \ - ChangeLog API.txt + ChangeLog API.txt \ + $(top_srcdir)/tests/*.sh if COMPAT_ARCH COMPAT=compat_arch_@ARCHTYPE@.c @@@ -35,9 -34,6 +36,9 @@@ if COMPAT_FUTE 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 \ @@@ -66,7 -62,7 +67,7 @@@ liburcu_signal_la_LIBADD = liburcu-comm 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 diff --combined urcu-bp.c index 3b2062d,f3249b4..912e9b2 --- a/urcu-bp.c +++ b/urcu-bp.c @@@ -421,7 -421,28 +421,30 @@@ void rcu_bp_after_fork_child(void 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" diff --combined urcu-bp.h index efb5dca,34f7a5c..3623f35 --- a/urcu-bp.h +++ b/urcu-bp.h @@@ -37,12 -37,6 +37,6 @@@ #include #include - /* - * See urcu-pointer.h and urcu/static/urcu-pointer.h for pointer - * publication headers. - */ - #include - #ifdef __cplusplus extern "C" { #endif @@@ -57,6 -51,12 +51,12 @@@ * 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 + #ifdef _LGPL_SOURCE #include @@@ -75,6 -75,11 +75,11 @@@ #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 */ /* @@@ -82,8 -87,54 +87,54 @@@ * 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 */ @@@ -135,6 -186,5 +186,6 @@@ static inline void rcu_thread_online(vo #include #include +#include #endif /* _URCU_BP_H */