summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qmutex.cpp
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2012-08-11 13:51:26 +0200
committerQt by Nokia <qt-info@nokia.com>2012-09-14 03:45:50 +0200
commit3acaa648f0ffd03c4695d0be7ed25e73724e4417 (patch)
treeac6f7576748270a048659fa91443236bb5cc1c26 /src/corelib/thread/qmutex.cpp
parentc40af42658eb8bc7dea5620d0ad788e6e8a6ec16 (diff)
Hoist the recursive mutex check out of the inner loop
A non-recursive mutex doesn't suddenly become recursive, so we don't need to check it multiple times. Change-Id: Id040254b6142d320a7bd3111491082ad09968404 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/thread/qmutex.cpp')
-rw-r--r--src/corelib/thread/qmutex.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index 1a064a1775..fa4fddca56 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -152,7 +152,7 @@ QMutex::QMutex(RecursionMode mode)
QMutex::~QMutex()
{
QMutexData *d = d_ptr.load();
- if (quintptr(d) > 0x3 && d->recursive) {
+ if (isRecursive()) {
delete static_cast<QRecursiveMutexPrivate *>(d);
} else if (d) {
#ifndef QT_LINUX_FUTEX
@@ -234,7 +234,12 @@ bool QBasicMutex::isRecursive() {
QMutexData *d = d_ptr.load();
if (quintptr(d) <= 0x3)
return false;
+#ifdef QT_LINUX_FUTEX
+ Q_ASSERT(d->recursive);
+ return true;
+#else
return d->recursive;
+#endif
}
@@ -333,6 +338,9 @@ bool QBasicMutex::isRecursive() {
*/
bool QBasicMutex::lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT
{
+ if (isRecursive())
+ return static_cast<QRecursiveMutexPrivate *>(d_ptr.load())->lock(timeout);
+
while (!fastTryLock()) {
QMutexData *copy = d_ptr.loadAcquire();
if (!copy) // if d is 0, the mutex is unlocked
@@ -349,8 +357,6 @@ bool QBasicMutex::lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT
}
copy = newD;
//the d->refCount is already 1 the deref will occurs when we unlock
- } else if (copy->recursive) {
- return static_cast<QRecursiveMutexPrivate *>(copy)->lock(timeout);
}
QMutexPrivate *d = static_cast<QMutexPrivate *>(copy);