diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2016-04-24 12:00:25 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2016-04-24 18:22:02 +0000 |
commit | 4579d966af2e5d4ba229f13312eeb2f921406038 (patch) | |
tree | 4b7edb25d55f3b7affd06ffce154bedba5f844cd | |
parent | 8586cccc071240a8eff6c5aa53a90010dae55193 (diff) |
QMutexPool: avoid QVarLengthArray of QAtomicPointers
QAtomicPointer is CopyConstructible, but std::atomic<T*> 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) <ogoffart@woboq.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/thread/qmutexpool.cpp | 11 | ||||
-rw-r--r-- | 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 90b6989467..522fd5eac2 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<QMutex>[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 796e65d960..33e9a52cb7 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<QAtomicPointer<QMutex>, 131> mutexes; + int count; + QAtomicPointer<QMutex> *mutexes; QMutex::RecursionMode recursionMode; }; |