12 #ifndef hifi_QTryReadLocker_h
13 #define hifi_QTryReadLocker_h
15 #include <QtCore/QReadWriteLock>
17 class QTryReadLocker {
19 QTryReadLocker(QReadWriteLock* readWriteLock);
20 QTryReadLocker(QReadWriteLock* readWriteLock,
int timeout);
23 bool isLocked()
const;
27 bool tryRelock(
int timeout);
29 QReadWriteLock* readWriteLock()
const;
32 Q_DISABLE_COPY(QTryReadLocker)
37 inline QTryReadLocker::QTryReadLocker(QReadWriteLock* areadWriteLock) :
38 _val(reinterpret_cast<quintptr>(areadWriteLock))
40 Q_ASSERT_X((_val & quintptr(1u)) == quintptr(0),
41 "QTryReadLocker",
"QTryReadLocker pointer is misaligned");
45 inline QTryReadLocker::QTryReadLocker(QReadWriteLock* areadWriteLock,
int timeout) :
46 _val(reinterpret_cast<quintptr>(areadWriteLock))
48 Q_ASSERT_X((_val & quintptr(1u)) == quintptr(0),
49 "QTryReadLocker",
"QTryReadLocker pointer is misaligned");
53 inline QTryReadLocker::~QTryReadLocker() {
57 inline bool QTryReadLocker::isLocked()
const {
58 return (_val & quintptr(1u)) == quintptr(1u);
61 inline void QTryReadLocker::unlock() {
62 if (_val && isLocked()) {
63 _val &= ~quintptr(1u);
64 readWriteLock()->unlock();
68 inline bool QTryReadLocker::tryRelock() {
69 if (_val && !isLocked()) {
70 if (readWriteLock()->tryLockForRead()) {
78 inline bool QTryReadLocker::tryRelock(
int timeout) {
79 if (_val && !isLocked()) {
80 if (readWriteLock()->tryLockForRead(timeout)) {
88 inline QReadWriteLock* QTryReadLocker::readWriteLock()
const {
89 return reinterpret_cast<QReadWriteLock*
>(_val & ~quintptr(1u));