diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2022-03-06 15:12:51 +0100 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2022-03-18 05:18:28 +0100 |
commit | 1b1456975347b044c11169458b53c9f6083dbc59 (patch) | |
tree | 023f05e1ff0470f9c6075e3d3a4b18f8cfc6c740 | |
parent | 9ec05e4f361f11796177ff2d26eaa078d733ad82 (diff) |
QMutexLocker: strenghten the locking operations
There is no reason to allow relock() on a locked locker, or unlock()
or an unlocked one, just like we don't allow that on a plain mutex
to begin with. The docs already said that e.g. relock() locks an
_unlocked_ locker.
[ChangeLog][QtCore][QMutexLocker] QMutexLocker allowed relock() and
unlock() on an already closed (resp. open) locker object. These
semantics have always been undocumented and are now unsupported
(in both cases they yield undefined behavior.)
Change-Id: Id5f67beb5dc30d6435dae88a3085fba93ec7d96e
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/thread/qmutex.h | 15 | ||||
-rw-r--r-- | tests/auto/corelib/thread/qmutexlocker/tst_qmutexlocker.cpp | 3 |
2 files changed, 6 insertions, 12 deletions
diff --git a/src/corelib/thread/qmutex.h b/src/corelib/thread/qmutex.h index e10a3f8f3d..9423585f64 100644 --- a/src/corelib/thread/qmutex.h +++ b/src/corelib/thread/qmutex.h @@ -256,7 +256,8 @@ public: inline ~QMutexLocker() { - unlock(); + if (m_isLocked) + unlock(); } inline bool isLocked() const noexcept @@ -266,20 +267,16 @@ public: inline void unlock() noexcept { - if (!m_isLocked) - return; + Q_ASSERT(m_isLocked); m_mutex->unlock(); m_isLocked = false; } inline void relock() QT_MUTEX_LOCK_NOEXCEPT { - if (m_isLocked) - return; - if (m_mutex) { - m_mutex->lock(); - m_isLocked = true; - } + Q_ASSERT(!m_isLocked); + m_mutex->lock(); + m_isLocked = true; } inline void swap(QMutexLocker &other) noexcept diff --git a/tests/auto/corelib/thread/qmutexlocker/tst_qmutexlocker.cpp b/tests/auto/corelib/thread/qmutexlocker/tst_qmutexlocker.cpp index 8844dd5624..e9544d8a40 100644 --- a/tests/auto/corelib/thread/qmutexlocker/tst_qmutexlocker.cpp +++ b/tests/auto/corelib/thread/qmutexlocker/tst_qmutexlocker.cpp @@ -180,9 +180,6 @@ void tst_QMutexLocker::lockerStateTest() QMutexLocker locker(&mutex); QVERIFY(locker.isLocked()); - locker.relock(); - QVERIFY(locker.isLocked()); - locker.unlock(); QVERIFY(!locker.isLocked()); |