Commit f7c2c1ce authored by Xavier Thompson's avatar Xavier Thompson

Optimise cypclass lock implementation assuming block acquisition semantics

parent 27953f00
......@@ -79,35 +79,15 @@
}
void CyObject_UNRLOCK() const {
int retry = 0;
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();
}
}
_readers.fetch_sub(1);
}
void CyObject_WLOCK() const {
int retry = 0;
while (true) {
uint32_t prev_readers = _readers;
if (prev_readers == 0) {
if (_readers.compare_exchange_weak(prev_readers, HAS_WRITER)) {
return;
}
uint32_t prev_readers = 0;
if (_readers.compare_exchange_weak(prev_readers, HAS_WRITER)) {
return;
}
retry++;
......@@ -124,8 +104,7 @@
}
void CyObject_UNWLOCK() const {
uint32_t prev_readers = HAS_WRITER;
_readers.compare_exchange_strong(prev_readers, 0);
_readers.store(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