94 inline ~QReadLocker() |
94 inline ~QReadLocker() |
95 { unlock(); } |
95 { unlock(); } |
96 |
96 |
97 inline void unlock() |
97 inline void unlock() |
98 { |
98 { |
99 if (q_lock) { |
99 if (q_val) { |
100 if ((q_val & quintptr(1u)) == quintptr(1u)) { |
100 if ((q_val & quintptr(1u)) == quintptr(1u)) { |
101 q_val &= ~quintptr(1u); |
101 q_val &= ~quintptr(1u); |
102 q_lock->unlock(); |
102 readWriteLock()->unlock(); |
103 } |
103 } |
104 } |
104 } |
105 } |
105 } |
106 |
106 |
107 inline void relock() |
107 inline void relock() |
108 { |
108 { |
109 if (q_lock) { |
109 if (q_val) { |
110 if ((q_val & quintptr(1u)) == quintptr(0u)) { |
110 if ((q_val & quintptr(1u)) == quintptr(0u)) { |
111 q_lock->lockForRead(); |
111 readWriteLock()->lockForRead(); |
112 q_val |= quintptr(1u); |
112 q_val |= quintptr(1u); |
113 } |
113 } |
114 } |
114 } |
115 } |
115 } |
116 |
116 |
117 inline QReadWriteLock *readWriteLock() const |
117 inline QReadWriteLock *readWriteLock() const |
118 { return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); } |
118 { return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); } |
119 |
119 |
120 private: |
120 private: |
121 Q_DISABLE_COPY(QReadLocker) |
121 Q_DISABLE_COPY(QReadLocker) |
122 union { |
122 quintptr q_val; |
123 QReadWriteLock *q_lock; |
|
124 quintptr q_val; |
|
125 }; |
|
126 }; |
123 }; |
127 |
124 |
128 inline QReadLocker::QReadLocker(QReadWriteLock *areadWriteLock) |
125 inline QReadLocker::QReadLocker(QReadWriteLock *areadWriteLock) |
129 : q_lock(areadWriteLock) |
126 : q_val(reinterpret_cast<quintptr>(areadWriteLock)) |
130 { |
127 { |
131 Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0), |
128 Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0), |
132 "QReadLocker", "QReadWriteLock pointer is misaligned"); |
129 "QReadLocker", "QReadWriteLock pointer is misaligned"); |
133 relock(); |
130 relock(); |
134 } |
131 } |
141 inline ~QWriteLocker() |
138 inline ~QWriteLocker() |
142 { unlock(); } |
139 { unlock(); } |
143 |
140 |
144 inline void unlock() |
141 inline void unlock() |
145 { |
142 { |
146 if (q_lock) { |
143 if (q_val) { |
147 if ((q_val & quintptr(1u)) == quintptr(1u)) { |
144 if ((q_val & quintptr(1u)) == quintptr(1u)) { |
148 q_val &= ~quintptr(1u); |
145 q_val &= ~quintptr(1u); |
149 q_lock->unlock(); |
146 readWriteLock()->unlock(); |
150 } |
147 } |
151 } |
148 } |
152 } |
149 } |
153 |
150 |
154 inline void relock() |
151 inline void relock() |
155 { |
152 { |
156 if (q_lock) { |
153 if (q_val) { |
157 if ((q_val & quintptr(1u)) == quintptr(0u)) { |
154 if ((q_val & quintptr(1u)) == quintptr(0u)) { |
158 q_lock->lockForWrite(); |
155 readWriteLock()->lockForWrite(); |
159 q_val |= quintptr(1u); |
156 q_val |= quintptr(1u); |
160 } |
157 } |
161 } |
158 } |
162 } |
159 } |
163 |
160 |
165 { return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); } |
162 { return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); } |
166 |
163 |
167 |
164 |
168 private: |
165 private: |
169 Q_DISABLE_COPY(QWriteLocker) |
166 Q_DISABLE_COPY(QWriteLocker) |
170 union{ |
167 quintptr q_val; |
171 QReadWriteLock *q_lock; |
|
172 quintptr q_val; |
|
173 }; |
|
174 }; |
168 }; |
175 |
169 |
176 inline QWriteLocker::QWriteLocker(QReadWriteLock *areadWriteLock) |
170 inline QWriteLocker::QWriteLocker(QReadWriteLock *areadWriteLock) |
177 : q_lock(areadWriteLock) |
171 : q_val(reinterpret_cast<quintptr>(areadWriteLock)) |
178 { |
172 { |
179 Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0), |
173 Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0), |
180 "QWriteLocker", "QReadWriteLock pointer is misaligned"); |
174 "QWriteLocker", "QReadWriteLock pointer is misaligned"); |
181 relock(); |
175 relock(); |
182 } |
176 } |