diff --git a/src/corelib/thread/qreadwritelock.cpp b/src/corelib/thread/qreadwritelock.cpp index 0fefc7dab69..186a0757e99 100644 --- a/src/corelib/thread/qreadwritelock.cpp +++ b/src/corelib/thread/qreadwritelock.cpp @@ -164,6 +164,14 @@ void QReadWriteLock::destroyRecursive(QReadWriteLockPrivate *d) \sa unlock(), lockForRead() */ +static Q_ALWAYS_INLINE bool fastTryLock(QAtomicPointer &d_ptr, + QReadWriteLockPrivate *dummyValue, + QReadWriteLockPrivate *&d) +{ + // Succeed fast if not contended + return d == nullptr && d_ptr.testAndSetAcquire(nullptr, dummyValue, d); +} + /*! \overload \since 6.6 @@ -183,9 +191,8 @@ void QReadWriteLock::destroyRecursive(QReadWriteLockPrivate *d) */ bool QReadWriteLock::tryLockForRead(QDeadlineTimer timeout) { - // Fast case: non contended: QReadWriteLockPrivate *d = d_ptr.loadRelaxed(); - if (d == nullptr && d_ptr.testAndSetAcquire(nullptr, dummyLockedForRead, d)) + if (fastTryLock(d_ptr, dummyLockedForRead, d)) return true; return contendedTryLockForRead(d_ptr, timeout, d); } @@ -195,9 +202,9 @@ Q_NEVER_INLINE static bool contendedTryLockForRead(QAtomicPointer