X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=include%2Furcu%2Ftls-compat.h;h=a2c94ded9cd9833558bb25d19b9908c6f47a9007;hb=2e359284497c361e3208501fc70d49b2c54dc4ef;hp=c17aca36b2c86a4b94f95e1c97c8aaa327f1f4a7;hpb=cb1f3ebfa99c3d49962fa2421ea3ae33d8dad757;p=userspace-rcu.git diff --git a/include/urcu/tls-compat.h b/include/urcu/tls-compat.h index c17aca3..a2c94de 100644 --- a/include/urcu/tls-compat.h +++ b/include/urcu/tls-compat.h @@ -32,7 +32,21 @@ extern "C" { #endif -#ifdef CONFIG_RCU_TLS /* Based on ax_tls.m4 */ +#ifdef CONFIG_RCU_TLS + +/* + * Default to '__thread' on all C and C++ compilers except MSVC. While C11 has + * '_Thread_local' and C++11 has 'thread_local', only '__thread' seems to have + * a compatible implementation when linking public extern symbols across + * language boundaries. + * + * For more details, see 'https://gcc.gnu.org/onlinedocs/gcc/Thread-Local.html'. + */ +#if defined(_MSC_VER) +# define URCU_TLS_STORAGE_CLASS __declspec(thread) +#else +# define URCU_TLS_STORAGE_CLASS __thread +#endif /* * Hint: How to define/declare TLS variables of compound types @@ -65,13 +79,13 @@ extern "C" { */ # define DECLARE_URCU_TLS(type, name) \ - CONFIG_RCU_TLS type name + URCU_TLS_STORAGE_CLASS type name # define DEFINE_URCU_TLS(type, name) \ - CONFIG_RCU_TLS type name + URCU_TLS_STORAGE_CLASS type name # define DEFINE_URCU_TLS_INIT(type, name, init) \ - CONFIG_RCU_TLS type name = (init) + URCU_TLS_STORAGE_CLASS type name = (init) # define URCU_TLS(name) (name)