Added autoconf checks for __thread compiler support
authorChris Frey <cdfrey@foursquare.net>
Fri, 29 Mar 2013 05:38:36 +0000 (29 01:38 -0400)
committerChris Frey <cdfrey@foursquare.net>
Fri, 29 Mar 2013 06:09:08 +0000 (29 02:09 -0400)
If the compiler does not support __thread or __declspec(thread)
as tested for in autoconf/ax_tls.m4, then libtar is not as threadsafe
as you may expect.

autoconf/ax_tls.m4 [new file with mode: 0644]
configure.ac
lib/decode.c
lib/internal.h

diff --git a/autoconf/ax_tls.m4 b/autoconf/ax_tls.m4
new file mode 100644 (file)
index 0000000..228110b
--- /dev/null
@@ -0,0 +1,74 @@
+# ===========================================================================
+#                 http://autoconf-archive.cryp.to/ax_tls.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_TLS
+#
+# DESCRIPTION
+#
+#   Provides a test for the compiler support of thread local storage (TLS)
+#   extensions. Defines TLS if it is found. Currently only knows about GCC
+#   and MSVC. I think SunPro uses the same as GCC, and Borland apparently
+#   supports either.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Alan Woodland <ajw05@aber.ac.uk>
+#
+#   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 <http://www.gnu.org/licenses/>.
+#
+#   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.
+
+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
+       case $ax_tls_keyword in
+          none) ac_cv_tls=none ; break ;;
+         *)
+             AC_TRY_COMPILE(
+                [#include <stdlib.h>
+                 static void
+                 foo(void) {
+                 static ] $ax_tls_keyword [ int bar;
+                 exit(1);
+                 }],
+                 [],
+                 [ac_cv_tls=$ax_tls_keyword ; break],
+                 ac_cv_tls=none
+             )
+         esac
+    done
+])
+
+  if test "$ac_cv_tls" != "none"; then
+    dnl AC_DEFINE([TLS], [], [If the compiler supports a TLS storage class define it to that here])
+    AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here])
+  fi
+  AC_MSG_RESULT($ac_cv_tls)
+])
index 22872bb..d79425b 100644 (file)
@@ -38,6 +38,15 @@ AC_PROG_MAKE_SET
 
 dnl ### Compiler characteristics. ##################################
 AC_C_CONST
+AX_TLS
+if test "$ac_cv_tls" = "none" ; then
+AC_MSG_NOTICE([
+****************************************************************
+WARNING: Your compiler does not support TLS __thread keywords,
+so your version of libtar will not be thread-safe.
+****************************************************************
+])
+fi
 
 
 dnl ### Checks for header files. ###################################
index cd5e8b3..c16ea2d 100644 (file)
@@ -26,7 +26,7 @@
 char *
 th_get_pathname(TAR *t)
 {
-       static __thread char filename[MAXPATHLEN];
+       static TLS_THREAD char filename[MAXPATHLEN];
 
        if (t->th_buf.gnu_longname)
                return t->th_buf.gnu_longname;
index 23243d2..da7be7f 100644 (file)
@@ -15,3 +15,9 @@
 
 #include <libtar.h>
 
+#ifdef TLS
+#define TLS_THREAD TLS
+#else
+#define TLS_THREAD
+#endif
+