Add Q_COMPILER_THREADSAFE_STATICS (a.k.a. "Magic Statics")
It had been so far only supported by GNU-style compilers due to the IA-64 portable C++ ABI. But it's mandated by C++11, so let's add the macro and use it in Q_GLOBAL_STATIC. Looks like Visual Studio "14" will support it. Change-Id: I9710b5146606c7e494c43413f49900419396cfe0 Reviewed-by: Olivier Goffart <ogoffart@woboq.com> Reviewed-by: David Faure <david.faure@kdab.com>
This commit is contained in:
parent
a58ec950f0
commit
ea6352109b
@ -472,6 +472,7 @@
|
||||
* N1720 Q_COMPILER_STATIC_ASSERT __cpp_static_assert = 200410
|
||||
* N2258 Q_COMPILER_TEMPLATE_ALIAS
|
||||
* N2659 Q_COMPILER_THREAD_LOCAL
|
||||
* N2660 Q_COMPILER_THREADSAFE_STATICS
|
||||
* N2765 Q_COMPILER_UDL __cpp_user_defined_literals = 200809
|
||||
* N2442 Q_COMPILER_UNICODE_STRINGS __cpp_unicode_literals = 200710
|
||||
* N2640 Q_COMPILER_UNIFORM_INIT
|
||||
@ -490,6 +491,7 @@
|
||||
#ifdef Q_CC_INTEL
|
||||
# define Q_COMPILER_RESTRICTED_VLA
|
||||
# define Q_COMPILER_VARIADIC_MACROS // C++11 feature supported as an extension in other modes, too
|
||||
# define Q_COMPILER_THREADSAFE_STATICS
|
||||
# if __INTEL_COMPILER < 1200
|
||||
# define Q_NO_TEMPLATE_FRIENDS
|
||||
# endif
|
||||
@ -551,6 +553,7 @@
|
||||
#if defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
|
||||
/* General C++ features */
|
||||
# define Q_COMPILER_RESTRICTED_VLA
|
||||
# define Q_COMPILER_THREADSAFE_STATICS
|
||||
# if !__has_feature(cxx_exceptions)
|
||||
# ifndef QT_NO_EXCEPTIONS
|
||||
# define QT_NO_EXCEPTIONS
|
||||
@ -705,6 +708,7 @@
|
||||
|
||||
#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG)
|
||||
# define Q_COMPILER_RESTRICTED_VLA
|
||||
# define Q_COMPILER_THREADSAFE_STATICS
|
||||
# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
|
||||
// GCC supports binary literals in C, C++98 and C++11 modes
|
||||
# define Q_COMPILER_BINARY_LITERALS
|
||||
@ -872,6 +876,13 @@
|
||||
# undef Q_COMPILER_RVALUE_REFS
|
||||
# undef Q_COMPILER_REF_QUALIFIERS
|
||||
# endif
|
||||
# if defined(Q_COMPILER_THREADSAFE_STATICS) && defined(Q_OS_MAC)
|
||||
// Mac OS X: Apple's low-level implementation of the C++ support library
|
||||
// (libc++abi.dylib, shared between libstdc++ and libc++) has deadlocks. The
|
||||
// C++11 standard requires the deadlocks to be removed, so this will eventually
|
||||
// be fixed; for now, let's disable this.
|
||||
# undef Q_COMPILER_THREADSAFE_STATICS
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -57,7 +57,7 @@ enum GuardValues {
|
||||
};
|
||||
}
|
||||
|
||||
#if defined(QT_NO_THREAD) || (defined(Q_CC_GNU) && !defined(Q_OS_MAC))
|
||||
#if defined(QT_NO_THREAD) || defined(Q_COMPILER_THREADSAFE_STATICS)
|
||||
// some compilers support thread-safe statics
|
||||
// The IA-64 C++ ABI requires this, so we know that all GCC versions since 3.4
|
||||
// support it. C++11 also requires this behavior.
|
||||
|
Loading…
Reference in New Issue
Block a user