Commit f7c2c1ce authored by Xavier Thompson's avatar Xavier Thompson

Optimise cypclass lock implementation assuming block acquisition semantics

parent 27953f00
...@@ -79,35 +79,15 @@ ...@@ -79,35 +79,15 @@
} }
void CyObject_UNRLOCK() const { void CyObject_UNRLOCK() const {
int retry = 0; _readers.fetch_sub(1);
while (true) {
uint32_t prev_readers = _readers;
if (prev_readers + 1 > 1) {
uint32_t new_readers = prev_readers - 1;
if (_readers.compare_exchange_weak(prev_readers, new_readers)) {
return;
}
}
else {
return;
}
retry++;
if (retry > RETRY_THRESHOLD) {
retry = 0;
std::this_thread::yield();
}
}
} }
void CyObject_WLOCK() const { void CyObject_WLOCK() const {
int retry = 0; int retry = 0;
while (true) { while (true) {
uint32_t prev_readers = _readers; uint32_t prev_readers = 0;
if (prev_readers == 0) { if (_readers.compare_exchange_weak(prev_readers, HAS_WRITER)) {
if (_readers.compare_exchange_weak(prev_readers, HAS_WRITER)) { return;
return;
}
} }
retry++; retry++;
...@@ -124,8 +104,7 @@ ...@@ -124,8 +104,7 @@
} }
void CyObject_UNWLOCK() const { void CyObject_UNWLOCK() const {
uint32_t prev_readers = HAS_WRITER; _readers.store(0);
_readers.compare_exchange_strong(prev_readers, 0);
} }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment