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>
This commit is contained in:
Bradley T. Hughes 2012-05-23 10:26:07 +02:00 committed by Qt by Nokia
parent 61904b8cfc
commit 88da8b4878
2 changed files with 23 additions and 7 deletions

View File

@ -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()

View File

@ -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(); }