QReadWriteLock: inline the constructor and destructor

Change-Id: Ieab617d69f3b4b54ab30fffd175b2500dd860431
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Thiago Macieira 2023-05-01 15:19:31 -07:00
parent 6ac0406464
commit 4f00e6c8b9
2 changed files with 22 additions and 5 deletions

View File

@ -101,6 +101,7 @@ static bool contendedTryLockForWrite(QAtomicPointer<QReadWriteLockPrivate> &d_pt
*/
/*!
\fn QReadWriteLock::QReadWriteLock(RecursionMode recursionMode)
\since 4.4
Constructs a QReadWriteLock object in the given \a recursionMode.
@ -109,21 +110,22 @@ static bool contendedTryLockForWrite(QAtomicPointer<QReadWriteLockPrivate> &d_pt
\sa lockForRead(), lockForWrite(), RecursionMode
*/
QReadWriteLock::QReadWriteLock(RecursionMode recursionMode)
: d_ptr(recursionMode == Recursive ? new QReadWriteLockPrivate(true) : nullptr)
QReadWriteLockPrivate *QReadWriteLock::initRecursive()
{
Q_ASSERT_X(!(quintptr(d_ptr.loadRelaxed()) & StateMask), "QReadWriteLock::QReadWriteLock", "bad d_ptr alignment");
auto d = new QReadWriteLockPrivate(true);
Q_ASSERT_X(!(quintptr(d) & StateMask), "QReadWriteLock::QReadWriteLock", "bad d_ptr alignment");
return d;
}
/*!
\fn QReadWriteLock::~QReadWriteLock()
Destroys the QReadWriteLock object.
\warning Destroying a read-write lock that is in use may result
in undefined behavior.
*/
QReadWriteLock::~QReadWriteLock()
void QReadWriteLock::destroyRecursive(QReadWriteLockPrivate *d)
{
auto d = d_ptr.loadAcquire();
if (isUncontendedLocked(d)) {
qWarning("QReadWriteLock: destroying locked QReadWriteLock");
return;

View File

@ -18,7 +18,9 @@ class Q_CORE_EXPORT QReadWriteLock
public:
enum RecursionMode { NonRecursive, Recursive };
QT_CORE_INLINE_SINCE(6, 6)
explicit QReadWriteLock(RecursionMode recursionMode = NonRecursive);
QT_CORE_INLINE_SINCE(6, 6)
~QReadWriteLock();
QT_CORE_INLINE_SINCE(6, 6)
@ -54,9 +56,22 @@ private:
Q_DISABLE_COPY(QReadWriteLock)
QAtomicPointer<QReadWriteLockPrivate> d_ptr;
friend class QReadWriteLockPrivate;
static QReadWriteLockPrivate *initRecursive();
static void destroyRecursive(QReadWriteLockPrivate *);
};
#if QT_CORE_INLINE_IMPL_SINCE(6, 6)
QReadWriteLock::QReadWriteLock(RecursionMode recursionMode)
: d_ptr(recursionMode == Recursive ? initRecursive() : nullptr)
{
}
QReadWriteLock::~QReadWriteLock()
{
if (auto d = d_ptr.loadAcquire())
destroyRecursive(d);
}
void QReadWriteLock::lockForRead()
{
tryLockForRead(QDeadlineTimer(QDeadlineTimer::Forever));