Fix: tests: invoke destroy APIs for queues/stacks
[urcu.git] / urcu / tls-compat.h
index 2f4023258c2cf658da196090a68d5757cc617753..8ac1ea0615ddc2eb91ee51e9e15b89bd094d4c81 100644 (file)
@@ -44,7 +44,7 @@ extern "C" {
  *     typedef int my_int_array_type[4];
  *     DEFINE_URCU_TLS(my_int_array_type, var_name);
  *
- * Another exmaple:
+ * Another example:
  *     typedef void (*call_rcu_flavor)(struct rcu_head *, XXXX);
  *     DECLARE_URCU_TLS(call_rcu_flavor, p_call_rcu);
  *
@@ -59,6 +59,9 @@ extern "C" {
  * Example: In any thread, the first call of URCU_TLS(rcu_reader)
  * is called from rcu_register_thread(), so we can ensure all later
  * URCU_TLS(rcu_reader) in any thread is async-signal-safe.
+ *
+ * Moreover, URCU_TLS variables should not be touched from signal
+ * handlers setup with with sigaltstack(2).
  */
 
 # define DECLARE_URCU_TLS(type, name)  \
@@ -71,6 +74,10 @@ extern "C" {
 
 #else /* #ifndef CONFIG_RCU_TLS */
 
+/*
+ * The *_1() macros ensure macro parameters are expanded.
+ */
+
 # include <pthread.h>
 
 struct urcu_tls {
@@ -79,14 +86,16 @@ struct urcu_tls {
        int init_done;
 };
 
-# define DECLARE_URCU_TLS(type, name)                          \
+# define DECLARE_URCU_TLS_1(type, name)                                \
        type *__tls_access_ ## name(void)
+# define DECLARE_URCU_TLS(type, name)                          \
+       DECLARE_URCU_TLS_1(type, name)
 
 /*
  * Note: we don't free memory at process exit, since it will be dealt
  * with by the OS.
  */
-# define DEFINE_URCU_TLS(type, name)                           \
+# define DEFINE_URCU_TLS_1(type, name)                         \
        type *__tls_access_ ## name(void)                       \
        {                                                       \
                static struct urcu_tls __tls_ ## name = {       \
@@ -115,7 +124,12 @@ struct urcu_tls {
                return __tls_p;                                 \
        }
 
-# define URCU_TLS(name)                (*__tls_access_ ## name())
+# define DEFINE_URCU_TLS(type, name)                           \
+       DEFINE_URCU_TLS_1(type, name)
+
+# define URCU_TLS_1(name)      (*__tls_access_ ## name())
+
+# define URCU_TLS(name)                URCU_TLS_1(name)
 
 #endif /* #else #ifndef CONFIG_RCU_TLS */
 
This page took 0.023372 seconds and 4 git commands to generate.