summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2015-08-26 20:06:57 +0200
committerLiang Qi <liang.qi@theqtcompany.com>2015-08-26 20:06:57 +0200
commitafab1546a7665bac2a8d7a6452e6aea46bfd2127 (patch)
treed616a7559c54a40e35a12b464f606774c9b0475b /src/corelib/thread
parent06b457c693f207e392d3021d77a0ab18cd78da92 (diff)
parent53ecaade10319ecc1d8115521ae6d8eba1ee55c1 (diff)
Merge remote-tracking branch 'origin/5.5' into 5.6
Conflicts: qmake/doc/snippets/code/doc_src_qmake-manual.pro qmake/doc/src/qmake-manual.qdoc src/corelib/io/qstorageinfo_unix.cpp src/corelib/tools/qbytearray.cpp src/widgets/kernel/qwidgetwindow.cpp tests/auto/corelib/io/qprocess/tst_qprocess.cpp tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp tests/auto/network/access/qnetworkreply/BLACKLIST Change-Id: I9efcd7e1cce1c394eed425c43aa6fce7d2edf31c
Diffstat (limited to 'src/corelib/thread')
-rw-r--r--src/corelib/thread/qmutex.cpp23
-rw-r--r--src/corelib/thread/thread.pri24
2 files changed, 34 insertions, 13 deletions
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index 002a9cc7bc..3269ee3ae8 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -563,7 +563,28 @@ const int FreeListConstants::Sizes[FreeListConstants::BlockCount] = {
};
typedef QFreeList<QMutexPrivate, FreeListConstants> FreeList;
-Q_GLOBAL_STATIC(FreeList, freelist);
+// We cannot use Q_GLOBAL_STATIC because it uses QMutex
+#if defined(Q_COMPILER_THREADSAFE_STATICS)
+FreeList *freelist()
+{
+ static FreeList list;
+ return &list;
+}
+#else
+FreeList *freelist()
+{
+ static QAtomicPointer<FreeList> list;
+ FreeList *local = list.loadAcquire();
+ if (!local) {
+ local = new FreeList;
+ if (!list.testAndSetRelease(0, local)) {
+ delete local;
+ local = list.loadAcquire();
+ }
+ }
+ return local;
+}
+#endif
}
QMutexPrivate *QMutexPrivate::allocate()
diff --git a/src/corelib/thread/thread.pri b/src/corelib/thread/thread.pri
index 3c1ddd984a..2cb00a6cf4 100644
--- a/src/corelib/thread/thread.pri
+++ b/src/corelib/thread/thread.pri
@@ -46,21 +46,21 @@ SOURCES += thread/qatomic.cpp \
unix:SOURCES += thread/qthread_unix.cpp \
thread/qwaitcondition_unix.cpp
-win32:SOURCES += thread/qmutex_win.cpp \
- thread/qthread_win.cpp \
+win32:SOURCES += thread/qthread_win.cpp \
thread/qwaitcondition_win.cpp
-integrity:SOURCES += thread/qmutex_unix.cpp \
- thread/qthread_unix.cpp \
+integrity:SOURCES += thread/qthread_unix.cpp \
thread/qwaitcondition_unix.cpp
-unix: {
- mac {
- SOURCES += thread/qmutex_mac.cpp
- } else:linux-*:!linux-lsb-* {
- SOURCES += thread/qmutex_linux.cpp
- } else {
- SOURCES += thread/qmutex_unix.cpp
- }
+false {
+ # files #included by others, but listed here so IDEs parsing this file know
+ # they are part of QtCore. Usually, qmake can find out that certain files
+ # are #included by others and thus remove from SOURCES, but it gets lost
+ # with qmutex.cpp.
+ SOURCES += \
+ thread/qmutex_linux.cpp \
+ thread/qmutex_mac.cpp \
+ thread/qmutex_unix.cpp \
+ thread/qmutex_win.cpp
}