14class QReadWriteLockPrivate;
16class Q_CORE_EXPORT QReadWriteLock
19 enum RecursionMode { NonRecursive, Recursive };
21 QT_CORE_INLINE_SINCE(6, 6)
22 explicit QReadWriteLock(RecursionMode recursionMode = NonRecursive);
23 QT_CORE_INLINE_SINCE(6, 6)
26 QT_CORE_INLINE_SINCE(6, 6)
28#if QT_CORE_REMOVED_SINCE(6
, 6
)
29 bool tryLockForRead();
31 QT_CORE_INLINE_SINCE(6, 6)
32 bool tryLockForRead(
int timeout);
33 bool tryLockForRead(QDeadlineTimer timeout = {});
35 QT_CORE_INLINE_SINCE(6, 6)
37#if QT_CORE_REMOVED_SINCE(6
, 6
)
38 bool tryLockForWrite();
40 QT_CORE_INLINE_SINCE(6, 6)
41 bool tryLockForWrite(
int timeout);
42 bool tryLockForWrite(QDeadlineTimer timeout = {});
47 Q_DISABLE_COPY(QReadWriteLock)
48 QAtomicPointer<QReadWriteLockPrivate> d_ptr;
49 friend class QReadWriteLockPrivate;
50 static QReadWriteLockPrivate *initRecursive();
51 static void destroyRecursive(QReadWriteLockPrivate *);
54#if QT_CORE_INLINE_IMPL_SINCE(6
, 6
)
55QReadWriteLock::QReadWriteLock(RecursionMode recursionMode)
56 : d_ptr(recursionMode == Recursive ? initRecursive() :
nullptr)
60QReadWriteLock::~QReadWriteLock()
62 if (
auto d = d_ptr.loadAcquire())
66void QReadWriteLock::lockForRead()
68 tryLockForRead(QDeadlineTimer(QDeadlineTimer::Forever));
71bool QReadWriteLock::tryLockForRead(
int timeout)
73 return tryLockForRead(QDeadlineTimer(timeout));
76void QReadWriteLock::lockForWrite()
78 tryLockForWrite(QDeadlineTimer(QDeadlineTimer::Forever));
81bool QReadWriteLock::tryLockForWrite(
int timeout)
83 return tryLockForWrite(QDeadlineTimer(timeout));
88#pragma warning( push )
89#pragma warning( disable : 4312
)
92class QT6_ONLY(Q_CORE_EXPORT) QReadLocker
96 inline QReadLocker(QReadWriteLock *readWriteLock);
104 if ((q_val & quintptr(1u)) == quintptr(1u)) {
105 q_val &= ~quintptr(1u);
106 readWriteLock()->unlock();
114 if ((q_val & quintptr(1u)) == quintptr(0u)) {
115 readWriteLock()->lockForRead();
116 q_val |= quintptr(1u);
121 inline QReadWriteLock *readWriteLock()
const
122 {
return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); }
125 Q_DISABLE_COPY(QReadLocker)
129inline QReadLocker::QReadLocker(QReadWriteLock *areadWriteLock)
130 : q_val(
reinterpret_cast<quintptr>(areadWriteLock))
132 Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0),
133 "QReadLocker",
"QReadWriteLock pointer is misaligned");
137class QT6_ONLY(Q_CORE_EXPORT) QWriteLocker
141 inline QWriteLocker(QReadWriteLock *readWriteLock);
143 inline ~QWriteLocker()
149 if ((q_val & quintptr(1u)) == quintptr(1u)) {
150 q_val &= ~quintptr(1u);
151 readWriteLock()->unlock();
159 if ((q_val & quintptr(1u)) == quintptr(0u)) {
160 readWriteLock()->lockForWrite();
161 q_val |= quintptr(1u);
166 inline QReadWriteLock *readWriteLock()
const
167 {
return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); }
171 Q_DISABLE_COPY(QWriteLocker)
175inline QWriteLocker::QWriteLocker(QReadWriteLock *areadWriteLock)
176 : q_val(
reinterpret_cast<quintptr>(areadWriteLock))
178 Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0),
179 "QWriteLocker",
"QReadWriteLock pointer is misaligned");
183#if defined(Q_CC_MSVC)
184#pragma warning( pop )
189class QT6_ONLY(Q_CORE_EXPORT) QReadWriteLock
192 enum RecursionMode { NonRecursive, Recursive };
193 inline explicit QReadWriteLock(RecursionMode = NonRecursive)
noexcept { }
194 inline ~QReadWriteLock() { }
196 void lockForRead()
noexcept { }
197 bool tryLockForRead()
noexcept {
return true; }
198 bool tryLockForRead(QDeadlineTimer)
noexcept {
return true; }
199 bool tryLockForRead(
int timeout)
noexcept { Q_UNUSED(timeout);
return true; }
201 void lockForWrite()
noexcept { }
202 bool tryLockForWrite()
noexcept {
return true; }
203 bool tryLockForWrite(QDeadlineTimer)
noexcept {
return true; }
204 bool tryLockForWrite(
int timeout)
noexcept { Q_UNUSED(timeout);
return true; }
206 void unlock()
noexcept { }
209 Q_DISABLE_COPY(QReadWriteLock)