Fix: handle sys_futex() FUTEX_WAIT interrupted by signal
[urcu.git] / urcu / static / urcu-pointer.h
index 906caa009c708c13cc2f9a6b0c1e989416e3aed7..06371e3dd1c066387db5316087346ccf9bbdf80b 100644 (file)
@@ -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 <mathieu.desnoyers@efficios.com>
  * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
@@ -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,9 +133,12 @@ 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 
This page took 0.024596 seconds and 4 git commands to generate.