From 22d4f117bd393dfea80575b4a186ebff65c076c1 Mon Sep 17 00:00:00 2001 From: David Faure Date: Tue, 8 Apr 2025 23:37:14 +0200 Subject: [PATCH] QReadWriteLock: extract method fastTryLock This removes a little bit of duplication, and reduces the temptation to remove the first part of tryLockForX as duplicated (it should remain there for performance reasons). Change-Id: I7ce102ceeb03b5ab4fe026b56fbba245b4c2f310 Reviewed-by: Thiago Macieira --- src/corelib/thread/qreadwritelock.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) 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