Fix: handle sys_futex() FUTEX_WAIT interrupted by signal
[urcu.git] / urcu / static / urcu-pointer.h
index 48dc5bf506d86b06ddb1b5b4cf72066508634493..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,9 +59,14 @@ 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)     ({                                     \
+#define _rcu_dereference(p)                                            \
+                               __extension__                           \
+                               ({                                      \
                                __typeof__(p) _________p1 = CMM_LOAD_SHARED(p); \
                                cmm_smp_read_barrier_depends();         \
                                (_________p1);                          \
@@ -73,9 +78,13 @@ 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);                  \
@@ -89,9 +98,13 @@ 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);       \
                if (!__builtin_constant_p(v) ||         \
@@ -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.023379 seconds and 4 git commands to generate.