summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2016-04-24 12:00:25 +0200
committerMarc Mutz <marc.mutz@kdab.com>2016-04-24 18:22:02 +0000
commit4579d966af2e5d4ba229f13312eeb2f921406038 (patch)
tree4b7edb25d55f3b7affd06ffce154bedba5f844cd /src/corelib
parent8586cccc071240a8eff6c5aa53a90010dae55193 (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>
Diffstat (limited to 'src/corelib')
-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 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;
};