diff options
author | Bradley T. Hughes <bradley.hughes@nokia.com> | 2012-05-23 10:26:07 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-29 07:35:31 +0200 |
commit | 88da8b4878a97faf2304a517e6173535bd6fb787 (patch) | |
tree | 2c60b1faf5a57c88a89bdc097fd57b1ff9e5a5cf /src/corelib/thread/qmutex.h | |
parent | 61904b8cfc68f3668ec9beed6e0746cf16d1a5f6 (diff) |
QMutex: de-inline lock(), unlock(), and tryLock()
See the discussion of this topic on the mailing list:
http://lists.qt-project.org/pipermail/development/2012-May/003943.html
The consensus is to not have these methods have inline code to actually
acquire the lock (i.e. no atomic test-and-set or similar). QBasicMutex
is unchanged, and continues to have inlined lock(), tryLock(), and
unlock(). QMutexLocker has been changed to always call QMutex::lock()
(even though the constructor takes a QBasicMutex parameter).
Change-Id: Ic7d2d9d581e6b254c84fdfdd8ce6c425535a8078
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/thread/qmutex.h')
-rw-r--r-- | src/corelib/thread/qmutex.h | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/corelib/thread/qmutex.h b/src/corelib/thread/qmutex.h index 0743c36457..22da73a8b8 100644 --- a/src/corelib/thread/qmutex.h +++ b/src/corelib/thread/qmutex.h @@ -96,8 +96,16 @@ public: enum RecursionMode { NonRecursive, Recursive }; explicit QMutex(RecursionMode mode = NonRecursive); ~QMutex(); + + void lock(); + bool tryLock(int timeout = 0); + void unlock(); + + using QBasicMutex::isRecursive; + private: Q_DISABLE_COPY(QMutex) + friend class QMutexLocker; }; class Q_CORE_EXPORT QMutexLocker @@ -107,12 +115,9 @@ public: { Q_ASSERT_X((reinterpret_cast<quintptr>(m) & quintptr(1u)) == quintptr(0), "QMutexLocker", "QMutex pointer is misaligned"); - if (m) { - m->lock(); - val = reinterpret_cast<quintptr>(m) | quintptr(1u); - } else { - val = 0; - } + val = quintptr(m); + // relock() here ensures that we call QMutex::lock() instead of QBasicMutex::lock() + relock(); } inline ~QMutexLocker() { unlock(); } |