From 76a2e658b76a960098d20cd71598d3b2709a6884 Mon Sep 17 00:00:00 2001 From: Ian Abbott Date: Wed, 18 Feb 2009 14:10:54 +0000 Subject: [PATCH] Put __comedi_errno variable into thread-local storage if the compiler supports it. Configuration test uses Alan Woodland's 'ax_tls.m4' from . --- AUTHORS | 1 + configure.ac | 2 ++ lib/error.c | 2 +- lib/libinternal.h | 3 +- m4/ax_tls.m4 | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 m4/ax_tls.m4 diff --git a/AUTHORS b/AUTHORS index 1b08ff7..8cd58a6 100644 --- a/AUTHORS +++ b/AUTHORS @@ -10,5 +10,6 @@ Steven Jenkins Luc Lefebvre Tim Ousley Bernd Porr +Alan Woodland [ax_tls.m4] Bean ZAHND diff --git a/configure.ac b/configure.ac index 2e6bc15..249d497 100644 --- a/configure.ac +++ b/configure.ac @@ -44,6 +44,8 @@ AC_PROG_LIBTOOL AC_HEADER_STDC([]) +AX_TLS + COMEDILIB_CFLAGS="$COMEDILIB_CFLAGS -I\$(top_srcdir)/include $COMEDILIB_DEBUG" COMEDILIB_LIBS="$COMEDILIB_LIBS \$(top_builddir)/lib/libcomedi.la -lm" AC_SUBST(COMEDILIB_CFLAGS) diff --git a/lib/error.c b/lib/error.c index d88c78c..835ae42 100644 --- a/lib/error.c +++ b/lib/error.c @@ -40,7 +40,7 @@ char *__comedilib_error_strings[]={ #define n_errors (sizeof(__comedilib_error_strings)/sizeof(void *)) int __comedi_loglevel=1; -int __comedi_errno=0; +TLS int __comedi_errno=0; EXPORT_ALIAS_DEFAULT(_comedi_loglevel,comedi_loglevel,0.7.18); int _comedi_loglevel(int loglevel) diff --git a/lib/libinternal.h b/lib/libinternal.h index 462521e..7f58c74 100644 --- a/lib/libinternal.h +++ b/lib/libinternal.h @@ -26,6 +26,7 @@ #define _COMEDILIB_DEPRECATED +#include "config.h" #include "comedilib.h" #include "comedi.h" #include "comedi_errno.h" @@ -66,7 +67,7 @@ extern int __comedi_init; extern int __comedi_loglevel; -extern int __comedi_errno; +extern TLS int __comedi_errno; #if 0 diff --git a/m4/ax_tls.m4 b/m4/ax_tls.m4 new file mode 100644 index 0000000..41620a7 --- /dev/null +++ b/m4/ax_tls.m4 @@ -0,0 +1,78 @@ +# =========================================================================== +# 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. +# +# LAST MODIFICATION +# +# 2008-04-12 +# +# COPYLEFT +# +# Copyright (c) 2008 Alan Woodland +# +# 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 Macro 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 + 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) +]) -- 2.26.2