diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2012-08-11 13:51:26 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-09-14 03:45:50 +0200 |
commit | 3acaa648f0ffd03c4695d0be7ed25e73724e4417 (patch) | |
tree | ac6f7576748270a048659fa91443236bb5cc1c26 /src/corelib/thread/qmutex.cpp | |
parent | c40af42658eb8bc7dea5620d0ad788e6e8a6ec16 (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.cpp | 12 |
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); |