From 4579d966af2e5d4ba229f13312eeb2f921406038 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sun, 24 Apr 2016 12:00:25 +0200 Subject: [PATCH] QMutexPool: avoid QVarLengthArray of QAtomicPointers QAtomicPointer is CopyConstructible, but std::atomic is not, for a reason. So avoid putting them in a QVarLengthArray, using a dynamic heap allocation instead. This sounds wasteful until you realize that virtually all users of QMutexPool (and we know them all) use the global instance(), and that each QMutex (131, by default) is heap-allocated, too. Change-Id: Ie9c95671ec42a1f51919c18631b623aad2c0d6ba Reviewed-by: Olivier Goffart (Woboq GmbH) Reviewed-by: Thiago Macieira --- src/corelib/thread/qmutexpool.cpp | 11 +++++------ src/corelib/thread/qmutexpool_p.h | 5 +++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/corelib/thread/qmutexpool.cpp b/src/corelib/thread/qmutexpool.cpp index 90b6989467c..522fd5eac24 100644 --- a/src/corelib/thread/qmutexpool.cpp +++ b/src/corelib/thread/qmutexpool.cpp @@ -92,11 +92,10 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMutexPool, globalMutexPool, (QMutex::Recursive)) QMutexPool is destructed. */ QMutexPool::QMutexPool(QMutex::RecursionMode recursionMode, int size) - : mutexes(size), recursionMode(recursionMode) + : count(size), + mutexes(new QAtomicPointer[size]()), // (): zero-initialize + recursionMode(recursionMode) { - for (int index = 0; index < mutexes.count(); ++index) { - mutexes[index].store(0); - } } /*! @@ -105,8 +104,8 @@ QMutexPool::QMutexPool(QMutex::RecursionMode recursionMode, int size) */ QMutexPool::~QMutexPool() { - for (int index = 0; index < mutexes.count(); ++index) - delete mutexes[index].load(); + qDeleteAll(mutexes, mutexes + count); + delete[] mutexes; } /*! diff --git a/src/corelib/thread/qmutexpool_p.h b/src/corelib/thread/qmutexpool_p.h index 796e65d9607..33e9a52cb77 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)) % mutexes.count(); + int index = uint(quintptr(address)) % count; QMutex *m = mutexes[index].load(); if (m) return m; @@ -78,7 +78,8 @@ public: private: QMutex *createMutex(int index); - QVarLengthArray, 131> mutexes; + int count; + QAtomicPointer *mutexes; QMutex::RecursionMode recursionMode; };