X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu-qsbr.h;h=346f906202aa60edc8f5c77628e18af5f130361a;hp=1dc4ddd6d27a0a59a810c5c7652e984374a0ac91;hb=4d1ce26fea0296ff67791c881836393fdd020cf9;hpb=7ac06cef7a7d9394332837edc5c0e9595286a5fc diff --git a/urcu-qsbr.h b/urcu-qsbr.h index 1dc4ddd..346f906 100644 --- a/urcu-qsbr.h +++ b/urcu-qsbr.h @@ -66,9 +66,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 +103,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))