X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Ftls-compat.h;h=a44b88d03066a5d5a847491496fe430f820b6ef9;hb=34b3f359c81e6400c9b451e49bf9dfaef7963509;hp=d7c7537042d9aca0f99abeb9c0ca7cc27b0fb934;hpb=4d0d66bb795d1ed938e11a97a4e5f71326e20c71;p=urcu.git diff --git a/urcu/tls-compat.h b/urcu/tls-compat.h index d7c7537..a44b88d 100644 --- a/urcu/tls-compat.h +++ b/urcu/tls-compat.h @@ -34,13 +34,43 @@ extern "C" { #ifdef CONFIG_RCU_TLS /* Based on ax_tls.m4 */ +/* + * Hint: How to define/declare TLS variables of compound types + * such as array or function pointers? + * + * Answer: Use typedef to assign a type_name to the compound type. + * Example: Define a TLS variable which is an int array with len=4: + * + * typedef int my_int_array_type[4]; + * DEFINE_URCU_TLS(my_int_array_type, var_name); + * + * 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) \ - CONFIG_RCU_TLS type __tls_ ## name + CONFIG_RCU_TLS type name # define DEFINE_URCU_TLS(type, name) \ - CONFIG_RCU_TLS type __tls_ ## name + CONFIG_RCU_TLS type name -# define URCU_TLS(name) (__tls_ ## name) +# define URCU_TLS(name) (name) #else /* #ifndef CONFIG_RCU_TLS */