51RWLock::RWLock(
int iMaxReaders):
52 maxReaders_(iMaxReaders),
53 spinLock_(iMaxReaders),
60 LASS_ASSERT(spinLock_.load(std::memory_order_relaxed) == maxReaders_);
61 LASS_ASSERT(writersTrying_.load(std::memory_order_relaxed) == 0);
69 while (writersTrying_.load() != 0)
73 oldSpinLock = spinLock_.load();
74 LASS_ASSERT(oldSpinLock>=0);
75 while (oldSpinLock <= 0)
77 oldSpinLock = spinLock_.load();
81 while (!spinLock_.compare_exchange_weak(oldSpinLock, oldSpinLock - 1));
86 writersTrying_.fetch_add(1);
90 expected = maxReaders_;
91 while (spinLock_.load() != expected)
96 while (!spinLock_.compare_exchange_weak(expected, 0));
102 LASS_ENFORCE(spinLock_.compare_exchange_strong(expected, maxReaders_));
103 writersTrying_.fetch_sub(1);
106void RWLock::unlockr()
108 [[maybe_unused]]
const int oldSpinLock = spinLock_.fetch_add(1);
109 LASS_ASSERT(oldSpinLock <= maxReaders_);
118 if (writersTrying_.load() != 0)
122 oldSpinLock = spinLock_.load();
123 LASS_ASSERT(oldSpinLock >= 0);
124 if (oldSpinLock <= 0)
129 while (!spinLock_.compare_exchange_weak(oldSpinLock, oldSpinLock - 1));
136 int expected = maxReaders_;
137 writersTrying_.fetch_add(1);
138 if (spinLock_.compare_exchange_strong(expected, 0))
144 writersTrying_.fetch_sub(1);
LockResult
Return code for lock functions.
@ lockSuccess
Mutex/CriticalSection is succesfully locked by this thread.
@ lockBusy
Mutex/CriticalSection is locked by another thread.
general utility, debug facilities, ...
Library for Assembled Shared Sources.