Overte C++ Documentation
QTryReadLocker.h
1 //
2 // QTryReadLocker.h
3 // shared/src/shared/QTryReadLocker.h
4 //
5 // Created by ClĂ©ment Brisset on 10/29/15.
6 // Copyright 2015 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_QTryReadLocker_h
13 #define hifi_QTryReadLocker_h
14 
15 #include <QtCore/QReadWriteLock>
16 
17 class QTryReadLocker {
18 public:
19  QTryReadLocker(QReadWriteLock* readWriteLock);
20  QTryReadLocker(QReadWriteLock* readWriteLock, int timeout);
21  ~QTryReadLocker();
22 
23  bool isLocked() const;
24 
25  void unlock();
26  bool tryRelock();
27  bool tryRelock(int timeout);
28 
29  QReadWriteLock* readWriteLock() const;
30 
31 private:
32  Q_DISABLE_COPY(QTryReadLocker)
33  quintptr _val;
34 };
35 
36 // Implementation
37 inline QTryReadLocker::QTryReadLocker(QReadWriteLock* areadWriteLock) :
38  _val(reinterpret_cast<quintptr>(areadWriteLock))
39 {
40  Q_ASSERT_X((_val & quintptr(1u)) == quintptr(0),
41  "QTryReadLocker", "QTryReadLocker pointer is misaligned");
42  tryRelock();
43 }
44 
45 inline QTryReadLocker::QTryReadLocker(QReadWriteLock* areadWriteLock, int timeout) :
46  _val(reinterpret_cast<quintptr>(areadWriteLock))
47 {
48  Q_ASSERT_X((_val & quintptr(1u)) == quintptr(0),
49  "QTryReadLocker", "QTryReadLocker pointer is misaligned");
50  tryRelock(timeout);
51 }
52 
53 inline QTryReadLocker::~QTryReadLocker() {
54  unlock();
55 }
56 
57 inline bool QTryReadLocker::isLocked() const {
58  return (_val & quintptr(1u)) == quintptr(1u);
59 }
60 
61 inline void QTryReadLocker::unlock() {
62  if (_val && isLocked()) {
63  _val &= ~quintptr(1u);
64  readWriteLock()->unlock();
65  }
66 }
67 
68 inline bool QTryReadLocker::tryRelock() {
69  if (_val && !isLocked()) {
70  if (readWriteLock()->tryLockForRead()) {
71  _val |= quintptr(1u);
72  return true;
73  }
74  }
75  return false;
76 }
77 
78 inline bool QTryReadLocker::tryRelock(int timeout) {
79  if (_val && !isLocked()) {
80  if (readWriteLock()->tryLockForRead(timeout)) {
81  _val |= quintptr(1u);
82  return true;
83  }
84  }
85  return false;
86 }
87 
88 inline QReadWriteLock* QTryReadLocker::readWriteLock() const {
89  return reinterpret_cast<QReadWriteLock*>(_val & ~quintptr(1u));
90 }
91 
92 #endif // hifi_QTryReadLocker_h