summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2016-05-14 11:17:48 -0700
committerJani Heikkinen <jani.heikkinen@qt.io>2016-05-24 17:54:54 +0000
commitb084739b89fbd32047d454075daf147073926f18 (patch)
treed81459990206c05dbb514c0fdf1659604ad57193 /src/corelib/thread
parentefd2ea8ea720833f9602154221d9654aea1f2e6f (diff)
Revert "QMutexPool: avoid QVarLengthArray of QAtomicPointers"
This reverts commit 4579d966af2e5d4ba229f13312eeb2f921406038. This causes a miscompilation with ICC 16 on Windows (MSVC 2015 ABI): the vector created by new[] with () in: mutexes(new QAtomicPointer<QMutex>[size]()), // (): zero-initialize does not actually zero-initialize (see disassembly in the bug report). This is definitely a compiler bug. Since we plan on removing QMutexPool in Qt 5.8 anyway, let's just revert the patch. Task-number: QTBUG-53360 Change-Id: I06bae9392f534e45b3f1ffff144e823b747e7962 Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Diffstat (limited to 'src/corelib/thread')
-rw-r--r--src/corelib/thread/qmutexpool.cpp11
-rw-r--r--src/corelib/thread/qmutexpool_p.h5
2 files changed, 8 insertions, 8 deletions
diff --git a/src/corelib/thread/qmutexpool.cpp b/src/corelib/thread/qmutexpool.cpp
index 522fd5eac2..90b6989467 100644
--- a/src/corelib/thread/qmutexpool.cpp
+++ b/src/corelib/thread/qmutexpool.cpp
@@ -92,10 +92,11 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMutexPool, globalMutexPool, (QMutex::Recursive))
QMutexPool is destructed.
*/
QMutexPool::QMutexPool(QMutex::RecursionMode recursionMode, int size)
- : count(size),
- mutexes(new QAtomicPointer<QMutex>[size]()), // (): zero-initialize
- recursionMode(recursionMode)
+ : mutexes(size), recursionMode(recursionMode)
{
+ for (int index = 0; index < mutexes.count(); ++index) {
+ mutexes[index].store(0);
+ }
}
/*!
@@ -104,8 +105,8 @@ QMutexPool::QMutexPool(QMutex::RecursionMode recursionMode, int size)
*/
QMutexPool::~QMutexPool()
{
- qDeleteAll(mutexes, mutexes + count);
- delete[] mutexes;
+ for (int index = 0; index < mutexes.count(); ++index)
+ delete mutexes[index].load();
}
/*!
diff --git a/src/corelib/thread/qmutexpool_p.h b/src/corelib/thread/qmutexpool_p.h
index 33e9a52cb7..796e65d960 100644
--- a/src/corelib/thread/qmutexpool_p.h
+++ b/src/corelib/thread/qmutexpool_p.h
@@ -66,7 +66,7 @@ public:
~QMutexPool();
inline QMutex *get(const void *address) {
- int index = uint(quintptr(address)) % count;
+ int index = uint(quintptr(address)) % mutexes.count();
QMutex *m = mutexes[index].load();
if (m)
return m;
@@ -78,8 +78,7 @@ public:
private:
QMutex *createMutex(int index);
- int count;
- QAtomicPointer<QMutex> *mutexes;
+ QVarLengthArray<QAtomicPointer<QMutex>, 131> mutexes;
QMutex::RecursionMode recursionMode;
};