summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread
diff options
context:
space:
mode:
authorBradley T. Hughes <bradley.hughes@nokia.com>2012-05-23 10:26:07 +0200
committerQt by Nokia <qt-info@nokia.com>2012-05-29 07:35:31 +0200
commit88da8b4878a97faf2304a517e6173535bd6fb787 (patch)
tree2c60b1faf5a57c88a89bdc097fd57b1ff9e5a5cf /src/corelib/thread
parent61904b8cfc68f3668ec9beed6e0746cf16d1a5f6 (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')
-rw-r--r--src/corelib/thread/qmutex.cpp13
-rw-r--r--src/corelib/thread/qmutex.h17
2 files changed, 23 insertions, 7 deletions
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index 145916d750..d310f56798 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 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(); }