From 88da8b4878a97faf2304a517e6173535bd6fb787 Mon Sep 17 00:00:00 2001 From: "Bradley T. Hughes" Date: Wed, 23 May 2012 10:26:07 +0200 Subject: [PATCH] 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 --- src/corelib/thread/qmutex.cpp | 13 ++++++++++++- src/corelib/thread/qmutex.h | 17 +++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp index 145916d7504..d310f567988 100644 --- a/src/corelib/thread/qmutex.cpp +++ b/src/corelib/thread/qmutex.cpp @@ -177,6 +177,10 @@ QMutex::~QMutex() \sa unlock() */ +void QMutex::lock() +{ + QBasicMutex::lock(); +} /*! \fn bool QMutex::tryLock(int timeout) @@ -201,7 +205,10 @@ QMutex::~QMutex() \sa lock(), unlock() */ - +bool QMutex::tryLock(int timeout) +{ + return QBasicMutex::tryLock(timeout); +} /*! \fn void QMutex::unlock() Unlocks the mutex. Attempting to unlock a mutex in a different @@ -210,6 +217,10 @@ QMutex::~QMutex() \sa lock() */ +void QMutex::unlock() +{ + QBasicMutex::unlock(); +} /*! \fn void QMutex::isRecursive() diff --git a/src/corelib/thread/qmutex.h b/src/corelib/thread/qmutex.h index 0743c36457c..22da73a8b81 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(m) & quintptr(1u)) == quintptr(0), "QMutexLocker", "QMutex pointer is misaligned"); - if (m) { - m->lock(); - val = reinterpret_cast(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(); }