X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu-qsbr.h;h=fdf47124d85f2b170f78410a996f5c3f40e4f8cc;hp=1dc4ddd6d27a0a59a810c5c7652e984374a0ac91;hb=ba59a0c7b244a0939a2298fc76a9002436ef9674;hpb=7ac06cef7a7d9394332837edc5c0e9595286a5fc diff --git a/urcu-qsbr.h b/urcu-qsbr.h index 1dc4ddd..fdf4712 100644 --- a/urcu-qsbr.h +++ b/urcu-qsbr.h @@ -57,6 +57,7 @@ #define rcu_thread_online _rcu_thread_online #define rcu_assign_pointer _rcu_assign_pointer +#define rcu_cmpxchg_pointer _rcu_cmpxchg_pointer #define rcu_xchg_pointer _rcu_xchg_pointer #define rcu_publish_content _rcu_publish_content @@ -66,9 +67,32 @@ * library wrappers to be used by non-LGPL compatible source code. */ +/* + * QSBR read lock/unlock are guaranteed to be no-ops. Therefore, we expose them + * in the LGPL header for any code to use. However, the debug version is not + * nops and may contain sanity checks. To activate it, applications must be + * recompiled with -DURCU_DEBUG (even non-LGPL/GPL applications). This is the + * best trade-off between license/performance/code triviality and + * library debugging & tracing features we could come up with. + */ + +#if (!defined(BUILD_QSBR_LIB) && defined(URCU_DEBUG)) + +static inline void rcu_read_lock(void) +{ +} + +static inline void rcu_read_lock(void) +{ +} + +#else /* !URCU_DEBUG */ + extern void rcu_read_lock(void); extern void rcu_read_unlock(void); +#endif /* !URCU_DEBUG */ + extern void *rcu_dereference(void *p); extern void rcu_quiescent_state(void); @@ -80,6 +104,10 @@ extern void *rcu_assign_pointer_sym(void **p, void *v); #define rcu_assign_pointer(p, v) \ rcu_assign_pointer_sym((void **)(p), (v)) +extern void *rcu_cmpxchg_pointer_sym(void **p, void *old, void *_new); +#define rcu_cmpxchg_pointer(p, old, _new) \ + rcu_cmpxchg_pointer_sym((void **)(p), (old), (_new)) + extern void *rcu_xchg_pointer_sym(void **p, void *v); #define rcu_xchg_pointer(p, v) \ rcu_xchg_pointer_sym((void **)(p), (v))