From b084739b89fbd32047d454075daf147073926f18 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Sat, 14 May 2016 11:17:48 -0700 Subject: 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[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 --- src/corelib/thread/qmutexpool.cpp | 11 ++++++----- src/corelib/thread/qmutexpool_p.h | 5 ++--- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'src/corelib/thread') 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[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 *mutexes; + QVarLengthArray, 131> mutexes; QMutex::RecursionMode recursionMode; }; -- cgit v1.2.3 From 7b23ebefb2360feb139ff6e10d2253396e58721e Mon Sep 17 00:00:00 2001 From: David Faure Date: Mon, 13 Jun 2016 13:55:38 +0200 Subject: QReadWriteLock: initialize member var currentWriter Found by valgrind's memcheck. Change-Id: I68f7c9279033e76d82f511b9d095548b4ef45723 Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/thread/qreadwritelock_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/corelib/thread') diff --git a/src/corelib/thread/qreadwritelock_p.h b/src/corelib/thread/qreadwritelock_p.h index 285f017655..24d25eb2be 100644 --- a/src/corelib/thread/qreadwritelock_p.h +++ b/src/corelib/thread/qreadwritelock_p.h @@ -65,7 +65,7 @@ class QReadWriteLockPrivate public: QReadWriteLockPrivate(bool isRecursive = false) : readerCount(0), writerCount(0), waitingReaders(0), waitingWriters(0), - recursive(isRecursive), id(0) {} + recursive(isRecursive), id(0), currentWriter(nullptr) {} QMutex mutex; QWaitCondition writerCond; -- cgit v1.2.3