X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fstatic%2Furcu-pointer.h;h=28333c57746e927bfc44e06e0a9fcc2b0e4794e2;hp=906caa009c708c13cc2f9a6b0c1e989416e3aed7;hb=67ecffc0f530a7b5c4dd5111ea7dd3213da8eb91;hpb=3daae22a68a6e74c99d39a8c6b628f5c9121c54a diff --git a/urcu/static/urcu-pointer.h b/urcu/static/urcu-pointer.h index 906caa0..28333c5 100644 --- a/urcu/static/urcu-pointer.h +++ b/urcu/static/urcu-pointer.h @@ -6,8 +6,8 @@ * * Userspace RCU header. Operations on pointers. * - * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu-pointer.h for - * linking dynamically with the userspace rcu library. + * TO BE INCLUDED ONLY IN CODE THAT IS TO BE RECOMPILED ON EACH LIBURCU + * RELEASE. See urcu.h for linking dynamically with the userspace rcu library. * * Copyright (c) 2009 Mathieu Desnoyers * Copyright (c) 2009 Paul E. McKenney, IBM Corporation. @@ -36,7 +36,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /** * _rcu_dereference - reads (copy) a RCU-protected pointer to a local variable @@ -59,10 +59,15 @@ extern "C" { * addition to forthcoming C++ standard. * * Should match rcu_assign_pointer() or rcu_xchg_pointer(). + * + * This macro is less than 10 lines long. The intent is that this macro + * meets the 10-line criterion in LGPL, allowing this function to be + * expanded directly in non-LGPL code. */ - -#define _rcu_dereference(p) ({ \ - typeof(p) _________p1 = CMM_LOAD_SHARED(p); \ +#define _rcu_dereference(p) \ + __extension__ \ + ({ \ + __typeof__(p) _________p1 = CMM_LOAD_SHARED(p); \ cmm_smp_read_barrier_depends(); \ (_________p1); \ }) @@ -73,12 +78,16 @@ extern "C" { * data structure, which can be safely freed after waiting for a quiescent state * using synchronize_rcu(). If fails (unexpected value), returns old (which * should not be freed !). + * + * This macro is less than 10 lines long. The intent is that this macro + * meets the 10-line criterion in LGPL, allowing this function to be + * expanded directly in non-LGPL code. */ - #define _rcu_cmpxchg_pointer(p, old, _new) \ + __extension__ \ ({ \ - typeof(*p) _________pold = (old); \ - typeof(*p) _________pnew = (_new); \ + __typeof__(*p) _________pold = (old); \ + __typeof__(*p) _________pnew = (_new); \ if (!__builtin_constant_p(_new) || \ ((_new) != NULL)) \ cmm_wmb(); \ @@ -89,11 +98,15 @@ extern "C" { * _rcu_xchg_pointer - same as rcu_assign_pointer, but returns the previous * pointer to the data structure, which can be safely freed after waiting for a * quiescent state using synchronize_rcu(). + * + * This macro is less than 10 lines long. The intent is that this macro + * meets the 10-line criterion in LGPL, allowing this function to be + * expanded directly in non-LGPL code. */ - #define _rcu_xchg_pointer(p, v) \ + __extension__ \ ({ \ - typeof(*p) _________pv = (v); \ + __typeof__(*p) _________pv = (v); \ if (!__builtin_constant_p(v) || \ ((v) != NULL)) \ cmm_wmb(); \ @@ -103,7 +116,7 @@ extern "C" { #define _rcu_set_pointer(p, v) \ do { \ - typeof(*p) _________pv = (v); \ + __typeof__(*p) _________pv = (v); \ if (!__builtin_constant_p(v) || \ ((v) != NULL)) \ cmm_wmb(); \ @@ -120,12 +133,15 @@ extern "C" { * them. It also makes sure the compiler does not reorder code initializing the * data structure before its publication. * - * Should match rcu_dereference_pointer(). + * Should match rcu_dereference(). + * + * This macro is less than 10 lines long. The intent is that this macro + * meets the 10-line criterion in LGPL, allowing this function to be + * expanded directly in non-LGPL code. */ - #define _rcu_assign_pointer(p, v) _rcu_set_pointer(&(p), v) -#ifdef __cplusplus +#ifdef __cplusplus } #endif