123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- dnl Check for the __thread/__declspec(thread) construct support.
- AC_DEFUN([AX_TLS_SUPPORT],
- [
- AH_TEMPLATE(HAVE_TLS_SUPPORT,
- [Defined if the compiler understands __thread or __declspec(thread)
- construct.])
- AH_TEMPLATE(TLS_SUPPORT_CONSTRUCT,
- [Defined to the actual TLS support construct.])
- ax_tls_support=no
- AC_CACHE_CHECK([for thread_local], [ac_cv_thread_local],
- [
- AC_LINK_IFELSE(
- [AC_LANG_PROGRAM(
- [[
- // check that pointers to classes work as well
- struct S { S () { } void foo () { } int member; };
- extern thread_local S * p_s;
- thread_local S * p_s = 0;
- extern thread_local int x;
- thread_local int * ptr = 0;
- int foo () { ptr = &x; return x; }
- thread_local int x = 1;
- ]],
- [[x = 2;
- foo ();
- p_s = new S;]])],
- [ac_cv_thread_local=yes
- ax_tls_support=yes],
- [ac_cv_thread_local=no],
- [ac_cv_thread_local=no])
- ])
- AS_IF([test "x$ac_cv_thread_local" = "xyes"],
- [AC_DEFINE(HAVE_TLS_SUPPORT, [1])
- AC_DEFINE(TLS_SUPPORT_CONSTRUCT, [thread_local])])
- AS_IF([test "x$ax_tls_support" = "xno"], [
- AC_CACHE_CHECK([for __thread], [ac_cv__thread_keyword], [
- AC_LINK_IFELSE(
- [AC_LANG_PROGRAM(
- [[#if defined (__NetBSD__)
- #include <sys/param.h>
- #if ! __NetBSD_Prereq__(5,1,0)
- #error NetBSD __thread support does not work before 5.1.0. It is missing __tls_get_addr.
- #endif
- #endif
- // check that pointers to classes work as well
- struct S { S () { } void foo () { } int member; };
- extern __thread S * p_s;
- __thread S * p_s = 0;
- extern __thread int x;
- __thread int * ptr = 0;
- int foo () { ptr = &x; return x; }
- __thread int x = 1;
- ]],
- [[x = 2;
- foo ();
- p_s = new S;
- ]])],
- [ac_cv__thread_keyword=yes
- ax_tls_support=yes],
- [ac_cv__thread_keyword=no],
- [ac_cv__thread_keyword=no])
- ])
- AS_IF([test "x$ac_cv__thread_keyword" = "xyes"],
- [AC_DEFINE(HAVE_TLS_SUPPORT, [1])
- AC_DEFINE(TLS_SUPPORT_CONSTRUCT, [__thread])])])
- AS_IF([test "x$ax_tls_support" = "xno"], [
- AC_CACHE_CHECK([for __declspec(thread)], [ac_cv_declspec_thread], [
- AC_LINK_IFELSE(
- [AC_LANG_PROGRAM(
- [[
- #if defined (__GNUC__)
- # error Please fail.
- And extra please fail.
- #else
- // check that pointers to classes work as well
- struct S { S () { } void foo () { } int member; };
- extern __declspec(thread) S * p_s;
- __declspec(thread) S * p_s = 0;
- extern __declspec(thread) int x;
- __declspec(thread) int * ptr = 0;
- int foo () { ptr = &x; return x; }
- __declspec(thread) int x = 1;
- #endif
- ]],
- [[x = 2;
- foo ();
- p_s = new S;]])],
- [ac_cv_declspec_thread=yes
- ax_tls_support=yes],
- [ac_cv_declspec_thread=no],
- [ac_cv_declspec_thread=no])])
- AS_IF([test "x$ac_cv_declspec_thread" = "xyes"],
- [AC_DEFINE(HAVE_TLS_SUPPORT, [1])
- AC_DEFINE(TLS_SUPPORT_CONSTRUCT, [__declspec(thread)])])])
- ])dnl AX_TLS_SUPPORT
|