X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Ftls-compat.h;h=8ac1ea0615ddc2eb91ee51e9e15b89bd094d4c81;hp=192a53609fb5f6bc445f98fdd6bc26918126687e;hb=2af1c19e6a553878fcb2a5106f050d5ed7ac0f54;hpb=c85e62f37e4db48038e4494c202f5a2c923262f2 diff --git a/urcu/tls-compat.h b/urcu/tls-compat.h index 192a536..8ac1ea0 100644 --- a/urcu/tls-compat.h +++ b/urcu/tls-compat.h @@ -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 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 */