Fix: tests: invoke destroy APIs for queues/stacks
[urcu.git] / urcu / tls-compat.h
index 192a53609fb5f6bc445f98fdd6bc26918126687e..8ac1ea0615ddc2eb91ee51e9e15b89bd094d4c81 100644 (file)
@@ -44,9 +44,24 @@ 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);
+ *
+ * NOTE: URCU_TLS() is NOT async-signal-safe, you can't use it
+ * inside any function which can be called from signal handler.
+ *
+ * But if pthread_getspecific() is async-signal-safe in your
+ * platform, you can make URCU_TLS() async-signal-safe via:
+ * ensuring the first call to URCU_TLS() of a given TLS variable of
+ * all threads is called earliest from a non-signal handler function.
+ *
+ * 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)  \
@@ -59,6 +74,10 @@ extern "C" {
 
 #else /* #ifndef CONFIG_RCU_TLS */
 
+/*
+ * The *_1() macros ensure macro parameters are expanded.
+ */
+
 # include <pthread.h>
 
 struct urcu_tls {
@@ -67,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 = {       \
@@ -103,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.02285 seconds and 4 git commands to generate.