From: Mathieu Desnoyers Date: Mon, 20 Apr 2020 15:30:49 +0000 (-0400) Subject: Fix: tls-compat.h exposes compiler-dependent public configuration X-Git-Tag: v0.9.7~1 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=9cce461a8bdfeec66d813018fcbeb40b9ce4b729;p=userspace-rcu.git Fix: tls-compat.h exposes compiler-dependent public configuration Exposing the storage class chosen by ax_tls.m4 in a public header is a bad idea, because if a recent gcc is used when configuring liburcu, thus detecting C11, it will choose _Thread_local. Then, if an external project uses urcu/tls-compat.h with an older gcc (e.g. 4.8), it will fail to build, because that storage class is unknown, and __thread should be used instead. Therefore, use a preprocessor conditional on __cplusplus to detect C++11 (and use thread_local). Else, the STDC version is used to select _Thread_local. Else check if _MSC_VER is defined to select __declspec(thread), or else rely on __thread as fallback. Remove ax_tls.m4 because it is now unused. Signed-off-by: Mathieu Desnoyers --- diff --git a/configure.ac b/configure.ac index a5a2ec2..7dfc2f3 100644 --- a/configure.ac +++ b/configure.ac @@ -33,14 +33,7 @@ AC_ARG_ENABLE([compiler-tls], [def_compiler_tls=$enableval], [def_compiler_tls="yes"]) -# If not overridden, use ax_tls.m4 to check if TLS is available. -AS_IF([test "x$def_compiler_tls" = "xyes"], - [AX_TLS([def_tls_detect=$ac_cv_tls], [:])], - [:]) - -AS_IF([test "x$def_tls_detect" = "x"], - [:], - [AC_DEFINE_UNQUOTED([CONFIG_RCU_TLS], $def_tls_detect)]) +AS_IF([test "x$def_compiler_tls" = "xyes"], AC_DEFINE([CONFIG_RCU_TLS], [1]), [:]) # Checks for C compiler AC_USE_SYSTEM_EXTENSIONS @@ -401,8 +394,8 @@ AS_IF([test "x$def_smp_support" = "xyes"],[ AS_ECHO("SMP support disabled.") ]) -AS_IF([test "x$def_tls_detect" = "x"],[ - AS_ECHO("Thread Local Storage (TLS): pthread_getspecific().") +AS_IF([test "x$def_compiler_tls" = "xyes"],[ + AS_ECHO("Thread Local Storage (TLS): compiler TLS.") ],[ - AS_ECHO("Thread Local Storage (TLS): $def_tls_detect.") + AS_ECHO("Thread Local Storage (TLS): pthread_getspecific().") ]) diff --git a/m4/ax_tls.m4 b/m4/ax_tls.m4 deleted file mode 100644 index 7c86daf..0000000 --- a/m4/ax_tls.m4 +++ /dev/null @@ -1,87 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_tls.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_TLS([action-if-found], [action-if-not-found]) -# -# DESCRIPTION -# -# Provides a test for the compiler support of thread local storage (TLS) -# extensions. Defines TLS if it is found. Currently knows about GCC/ICC -# and MSVC. I think SunPro uses the same as GCC, and Borland apparently -# supports either. -# -# LICENSE -# -# Copyright (c) 2008 Alan Woodland -# Copyright (c) 2010 Diego Elio Petteno` -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 11 - -# Define m4_ifblank and m4_ifnblank macros from introduced in -# autotools 2.64 m4sugar.m4 if using an earlier autotools. - -ifdef([m4_ifblank], [], [ -m4_define([m4_ifblank], -[m4_if(m4_translit([[$1]], [ ][ ][ -]), [], [$2], [$3])]) -]) - - -ifdef([m4_ifnblank], [], [ -m4_define([m4_ifnblank], -[m4_if(m4_translit([[$1]], [ ][ ][ -]), [], [$3], [$2])]) -]) - -AC_DEFUN([AX_TLS], [ - AC_MSG_CHECKING(for thread local storage (TLS) class) - AC_CACHE_VAL(ac_cv_tls, [ - ax_tls_keywords="__thread __declspec(thread) none" - for ax_tls_keyword in $ax_tls_keywords; do - AS_CASE([$ax_tls_keyword], - [none], [ac_cv_tls=none ; break], - [AC_TRY_LINK( - [$ax_tls_keyword int foo;], - [++foo;], - [ac_cv_tls=$ax_tls_keyword ; break], - [ac_cv_tls=none] - )]) - done - ]) - AC_MSG_RESULT($ac_cv_tls) - - AS_IF([test "$ac_cv_tls" != "none"], - AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here]) - m4_ifnblank([$1], [$1]), - m4_ifnblank([$2], [$2]) - ) -]) diff --git a/urcu/tls-compat.h b/urcu/tls-compat.h index 8ac1ea0..325b01b 100644 --- a/urcu/tls-compat.h +++ b/urcu/tls-compat.h @@ -32,7 +32,17 @@ extern "C" { #endif -#ifdef CONFIG_RCU_TLS /* Based on ax_tls.m4 */ +#ifdef CONFIG_RCU_TLS + +#if defined (__cplusplus) && (__cplusplus >= 201103L) +# define URCU_TLS_STORAGE_CLASS thread_local +#elif defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +# define URCU_TLS_STORAGE_CLASS _Thread_local +#elif 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,10 +75,10 @@ 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 URCU_TLS(name) (name)