]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxUSE_COMPILER_TLS to allow disabling compiler TLS support.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 17 Jun 2012 21:34:47 +0000 (21:34 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 17 Jun 2012 21:34:47 +0000 (21:34 +0000)
Compiler TLS support is broken under Win32/MSVC when used for a code which is
part of a dynamically loaded DLL, so allow disabling it.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71792 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

14 files changed:
configure
configure.in
docs/doxygen/mainpages/const_wxusedef.h
include/wx/chkconf.h
include/wx/gtk/setup0.h
include/wx/motif/setup0.h
include/wx/msw/setup0.h
include/wx/msw/wince/setup.h
include/wx/os2/setup0.h
include/wx/osx/setup0.h
include/wx/setup_inc.h
include/wx/tls.h
include/wx/univ/setup0.h
setup.h.in

index 80f2f30f3abb8537b57b74aa203bb4e561260d70..a629c2ec3e6516ba83ff72f21aba38af1a17d145 100755 (executable)
--- a/configure
+++ b/configure
@@ -32030,7 +32030,7 @@ EOF
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; } ; then :
 
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 
     ax_gcc_version_option=yes
@@ -32038,7 +32038,7 @@ $as_echo "yes" >&6; }
 
 else
 
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 
     ax_gcc_version_option=no
@@ -32509,6 +32509,9 @@ done
 
       fi
 
+$as_echo "#define wxUSE_COMPILER_TLS 1" >>confdefs.h
+
+
 if test "$wxUSE_THREADS" = "yes"; then
   $as_echo "#define wxUSE_THREADS 1" >>confdefs.h
 
index 95a2720ad7c312f65802446d1b5607bbf16bfb02..b38d6b7b169189b2a132d008685fe574fd5e4913 100644 (file)
@@ -5226,6 +5226,10 @@ dnl AC_CHECK_FUNC(getaddrinfo, AC_DEFINE(HAVE_GETADDRINFO), [
 dnl    ]
 dnl )
 
+dnl This is currently always defined under Unix, there is no reason to ever
+dnl disable compiler TLS support there.
+AC_DEFINE(wxUSE_COMPILER_TLS)
+
 if test "$wxUSE_THREADS" = "yes"; then
   AC_DEFINE(wxUSE_THREADS)
 
index c7be578182fcd8f61592c484718ce3b88308d50d..2cbc3639d42408ab8e0de53656da9c405d83c6cf 100644 (file)
@@ -92,6 +92,7 @@ library:
 @itemdef{wxUSE_COLOURPICKERCTRL, Use wxColourPickerCtrl class.}
 @itemdef{wxUSE_COMBOBOX, Use wxComboBox class.}
 @itemdef{wxUSE_COMBOCTRL, Use wxComboCtrl class.}
+@itemdef{wxUSE_COMPILER_TLS, Can be set to 0 to prevent using compile thread-specific variables support.}
 @itemdef{wxUSE_CONFIG, Use wxConfig and related classes.}
 @itemdef{wxUSE_CONFIG_NATIVE, When enabled use native OS configuration instead of the wxFileConfig class.}
 @itemdef{wxUSE_CONSOLE_EVENTLOOP, Enable event loop in console programs.}
index b1c741e43d02b2710b04b04adc9e07bb3a1d895a..467dbdae3bde938b72f15e2a8819dafbd945e569 100644 (file)
 #   endif
 #endif /* wxUSE_ANY */
 
+#ifndef wxUSE_COMPILER_TLS
+#   ifdef wxABORT_ON_CONFIG_ERROR
+#       error "wxUSE_COMPILER_TLS must be defined, please read comment near the top of this file."
+#   else
+#       define wxUSE_COMPILER_TLS 0
+#   endif
+#endif /* !defined(wxUSE_COMPILER_TLS) */
+
 #ifndef wxUSE_CONSOLE_EVENTLOOP
 #   ifdef wxABORT_ON_CONFIG_ERROR
 #       error "wxUSE_CONSOLE_EVENTLOOP must be defined, please read comment near the top of this file."
index 2561a19e1bc6441bc5e73ae6a647a379a1d4b125..197862a5743a6a95a80a7ae182a7ac9e01fca9c8 100644 (file)
 // Recommended setting: 1 if you want to support multiple languages
 #define wxUSE_PRINTF_POS_PARAMS      1
 
+// Enable the use of compiler-specific thread local storage keyword, if any.
+// This is used for wxTLS_XXX() macros implementation and normally should use
+// the compiler-provided support as it's simpler and more efficient, but must
+// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using
+// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS
+// support that results in crashes when any TLS variables are used. So if you
+// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set
+// this to 0.
+//
+// Default is 1, but set to 0 if the scenario above is applicable.
+#define wxUSE_COMPILER_TLS 1
 
 // ----------------------------------------------------------------------------
 // Interoperability with the standard library.
index a6eab82ee2fac652fb6036805f153fc5b09402df..ce146a7adf507bb36bfa252712bfa0389fb9bd78 100644 (file)
 // Recommended setting: 1 if you want to support multiple languages
 #define wxUSE_PRINTF_POS_PARAMS      1
 
+// Enable the use of compiler-specific thread local storage keyword, if any.
+// This is used for wxTLS_XXX() macros implementation and normally should use
+// the compiler-provided support as it's simpler and more efficient, but must
+// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using
+// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS
+// support that results in crashes when any TLS variables are used. So if you
+// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set
+// this to 0.
+//
+// Default is 1, but set to 0 if the scenario above is applicable.
+#define wxUSE_COMPILER_TLS 1
 
 // ----------------------------------------------------------------------------
 // Interoperability with the standard library.
index 22feb8ff63404d7882615c2a76c92c56b05a0f2d..453a5a0ed7b1981590e6f67815f0c9de21766221 100644 (file)
 // Recommended setting: 1 if you want to support multiple languages
 #define wxUSE_PRINTF_POS_PARAMS      1
 
+// Enable the use of compiler-specific thread local storage keyword, if any.
+// This is used for wxTLS_XXX() macros implementation and normally should use
+// the compiler-provided support as it's simpler and more efficient, but must
+// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using
+// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS
+// support that results in crashes when any TLS variables are used. So if you
+// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set
+// this to 0.
+//
+// Default is 1, but set to 0 if the scenario above is applicable.
+#define wxUSE_COMPILER_TLS 1
 
 // ----------------------------------------------------------------------------
 // Interoperability with the standard library.
index d91fbf8843adb8ef1cf311e8c3900b94bcf6e2e5..feacc9d61749aec1dbb116fc4a74d2692ebbdf00 100644 (file)
 // Recommended setting: 1 if you want to support multiple languages
 #define wxUSE_PRINTF_POS_PARAMS      1
 
+// Enable the use of compiler-specific thread local storage keyword, if any.
+// This is used for wxTLS_XXX() macros implementation and normally should use
+// the compiler-provided support as it's simpler and more efficient, but must
+// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using
+// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS
+// support that results in crashes when any TLS variables are used. So if you
+// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set
+// this to 0.
+//
+// Default is 1, but set to 0 if the scenario above is applicable.
+#define wxUSE_COMPILER_TLS 1
 
 // ----------------------------------------------------------------------------
 // Interoperability with the standard library.
index 45379059d8f36ddeee2c98d9da7a473d6fbd67ed..c5522b1f177fa91bdd0fbed54ec17a2fd73cf78a 100644 (file)
 // Recommended setting: 1 if you want to support multiple languages
 #define wxUSE_PRINTF_POS_PARAMS      1
 
+// Enable the use of compiler-specific thread local storage keyword, if any.
+// This is used for wxTLS_XXX() macros implementation and normally should use
+// the compiler-provided support as it's simpler and more efficient, but must
+// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using
+// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS
+// support that results in crashes when any TLS variables are used. So if you
+// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set
+// this to 0.
+//
+// Default is 1, but set to 0 if the scenario above is applicable.
+#define wxUSE_COMPILER_TLS 1
 
 // ----------------------------------------------------------------------------
 // Interoperability with the standard library.
index 1bc7474fb2d734eda815f5c3adfa285a3ff4a1ff..a20acabe4baf627686e09a81aa0e6653b88cdd8d 100644 (file)
 // Recommended setting: 1 if you want to support multiple languages
 #define wxUSE_PRINTF_POS_PARAMS      1
 
+// Enable the use of compiler-specific thread local storage keyword, if any.
+// This is used for wxTLS_XXX() macros implementation and normally should use
+// the compiler-provided support as it's simpler and more efficient, but must
+// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using
+// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS
+// support that results in crashes when any TLS variables are used. So if you
+// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set
+// this to 0.
+//
+// Default is 1, but set to 0 if the scenario above is applicable.
+#define wxUSE_COMPILER_TLS 1
 
 // ----------------------------------------------------------------------------
 // Interoperability with the standard library.
index 9b8dade93644de4e65481d0c23b9281dd51afb30..712dcca883c429eea23daf3bfaec8b8fd74d41b4 100644 (file)
 // Recommended setting: 1 if you want to support multiple languages
 #define wxUSE_PRINTF_POS_PARAMS      1
 
+// Enable the use of compiler-specific thread local storage keyword, if any.
+// This is used for wxTLS_XXX() macros implementation and normally should use
+// the compiler-provided support as it's simpler and more efficient, but must
+// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using
+// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS
+// support that results in crashes when any TLS variables are used. So if you
+// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set
+// this to 0.
+//
+// Default is 1, but set to 0 if the scenario above is applicable.
+#define wxUSE_COMPILER_TLS 1
 
 // ----------------------------------------------------------------------------
 // Interoperability with the standard library.
index 4fbc287c5c16098fbfbab9c618ad23e823d703dc..6886434c007fa34b71d52d5017348f5bf5b8e502 100644 (file)
 #if !wxUSE_THREADS
     #define wxHAS_COMPILER_TLS
     #define wxTHREAD_SPECIFIC_DECL
+// otherwise try to find the compiler-specific way to handle TLS unless
+// explicitly disabled by setting wxUSE_COMPILER_TLS to 0 (it is 1 by default).
+#elif wxUSE_COMPILER_TLS
 // __thread keyword is not supported correctly by MinGW, at least in some
 // configurations, see http://sourceforge.net/support/tracker.php?aid=2837047
 // and when in doubt we prefer to not use it at all.
-#elif defined(HAVE___THREAD_KEYWORD) && !defined(__MINGW32__)
+#if defined(HAVE___THREAD_KEYWORD) && !defined(__MINGW32__)
     #define wxHAS_COMPILER_TLS
     #define wxTHREAD_SPECIFIC_DECL __thread
 // MSVC has its own version which might be supported by some other Windows
@@ -33,7 +36,8 @@
 #elif wxCHECK_VISUALC_VERSION(7)
     #define wxHAS_COMPILER_TLS
     #define wxTHREAD_SPECIFIC_DECL __declspec(thread)
-#endif
+#endif // compilers
+#endif // wxUSE_COMPILER_TLS
 
 // ----------------------------------------------------------------------------
 // define wxTLS_TYPE()
index bdac6a94a22cf386147462590757787bdde9c192..66227d0b772ceb0ac4e9311d12ed9e4dac62d9d4 100644 (file)
 // Recommended setting: 1 if you want to support multiple languages
 #define wxUSE_PRINTF_POS_PARAMS      1
 
+// Enable the use of compiler-specific thread local storage keyword, if any.
+// This is used for wxTLS_XXX() macros implementation and normally should use
+// the compiler-provided support as it's simpler and more efficient, but must
+// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using
+// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS
+// support that results in crashes when any TLS variables are used. So if you
+// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set
+// this to 0.
+//
+// Default is 1, but set to 0 if the scenario above is applicable.
+#define wxUSE_COMPILER_TLS 1
 
 // ----------------------------------------------------------------------------
 // Interoperability with the standard library.
index c324fe185a42106527e5b6b8527e6355a0375ce2..6f21cdae9b4da9af51c151038fc30005143c3346 100644 (file)
 
 #define wxUSE_PRINTF_POS_PARAMS      0
 
+#define wxUSE_COMPILER_TLS 0
 
 
 #define wxUSE_STL 0