From a767fdc348289dc37026ee3ab46d1d4102ff57f7 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 15 May 2012 14:35:44 -0400 Subject: [PATCH] Add TLS detection m4 macro MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Will allow urcu to support OSes that require to use pthread TLS (and do not provide __thread TLS support). Suggested-by: Marek Vavruša Signed-off-by: Mathieu Desnoyers --- .gitignore | 14 +++++++-- LICENSE | 8 ++++- config/ax_tls.m4 | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 5 ++++ urcu/config.h.in | 3 ++ 5 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 config/ax_tls.m4 diff --git a/.gitignore b/.gitignore index 1112e43..15e9fc3 100644 --- a/.gitignore +++ b/.gitignore @@ -78,7 +78,6 @@ tests/*.log .libs/ Makefile.in Makefile -*.m4 *.la *.bz2 *.o @@ -86,7 +85,18 @@ Makefile *.loT /config.log /configure -/config/ +/config/compile +/config/config.guess +/config/config.sub +/config/depcomp +/config/install-sh +/config/libtool.m4 +/config/ltmain.sh +/config/lt~obsolete.m4 +/config/ltoptions.m4 +/config/ltsugar.m4 +/config/ltversion.m4 +/config/missing /libtool /stamp-h1 /config.h.in diff --git a/LICENSE b/LICENSE index ad13f78..eb696b2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ Userspace RCU library licensing Mathieu Desnoyers -May 10, 2009 +May 15, 2012 * LGPLv2.1 @@ -57,3 +57,9 @@ test_urcu.c test_urcu_yield.c test_rwlock_timing.c urcu-asm.c + +* GPLv3 (or later) + +The following build-related macro is under GPLv3 (or later): + +m4/ax_tls.m4 diff --git a/config/ax_tls.m4 b/config/ax_tls.m4 new file mode 100644 index 0000000..033e3b1 --- /dev/null +++ b/config/ax_tls.m4 @@ -0,0 +1,76 @@ +# =========================================================================== +# 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 10 + +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_COMPILE( + [#include + static void + foo(void) { + static ] $ax_tls_keyword [ int bar; + exit(1); + }], + [], + [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/configure.ac b/configure.ac index 6bf1cb9..1790bb8 100644 --- a/configure.ac +++ b/configure.ac @@ -15,6 +15,8 @@ AC_CANONICAL_HOST AM_INIT_AUTOMAKE([foreign dist-bzip2 no-dist-gzip]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) +m4_include([config/ax_tls.m4]) + AC_CONFIG_SRCDIR([urcu.h]) AC_CONFIG_HEADERS([config.h urcu/config.h]) @@ -24,6 +26,9 @@ AH_TEMPLATE([CONFIG_RCU_HAVE_FENCE], [Defined when on a system that has memory f AH_TEMPLATE([CONFIG_RCU_HAVE_FUTEX], [Defined when on a system with futex support.]) AH_TEMPLATE([CONFIG_RCU_COMPAT_ARCH], [Compatibility mode for i386 which lacks cmpxchg instruction.]) AH_TEMPLATE([CONFIG_RCU_ARM_HAVE_DMB], [Use the dmb instruction if available for use on ARM.]) +AH_TEMPLATE([CONFIG_RCU_TLS], [TLS provided by the compiler.]) + +AX_TLS([AC_DEFINE_UNQUOTED([CONFIG_RCU_TLS], $ac_cv_tls)], []) # Checks for programs. AC_PROG_CC diff --git a/urcu/config.h.in b/urcu/config.h.in index 02c7b2e..de1d1d0 100644 --- a/urcu/config.h.in +++ b/urcu/config.h.in @@ -16,3 +16,6 @@ /* Use the dmb instruction is available for use on ARM. */ #undef CONFIG_RCU_ARM_HAVE_DMB + +/* TLS provided by the compiler. */ +#define CONFIG_RCU_TLS TLS -- 2.34.1