}
UDPC::LockObj<false> UDPC::SharedSpinLock::try_spin_read_lock() {
- bool expected = false;
- if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
- if (!write) {
- ++read;
- spinLock.store(false, std::memory_order_release);
- return LockObj<false>(selfWeakPtr, Badge{});
- } else {
- spinLock.store(false, std::memory_order_release);
+ bool expected;
+ while (true) {
+ expected = false;
+ if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
+ if (!write) {
+ ++read;
+ spinLock.store(false, std::memory_order_release);
+ return LockObj<false>(selfWeakPtr, Badge{});
+ } else {
+ spinLock.store(false, std::memory_order_release);
+ break;
+ }
}
}
return LockObj<false>{};
}
UDPC::LockObj<true> UDPC::SharedSpinLock::try_spin_write_lock() {
- bool expected = false;
- if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
- if (!write && read == 0) {
- write = true;
- spinLock.store(false, std::memory_order_release);
- return LockObj<true>(selfWeakPtr, Badge{});
- } else {
- spinLock.store(false, std::memory_order_release);
+ bool expected;
+ while (true) {
+ expected = false;
+ if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
+ if (!write && read == 0) {
+ write = true;
+ spinLock.store(false, std::memory_order_release);
+ return LockObj<true>(selfWeakPtr, Badge{});
+ } else {
+ spinLock.store(false, std::memory_order_release);
+ break;
+ }
}
}
return LockObj<true>{};
UDPC::LockObj<false> UDPC::SharedSpinLock::try_trade_write_for_read_lock(UDPC::LockObj<true> &lockObj) {
if (lockObj.isValid() && lockObj.badge.isValid) {
- bool expected = false;
- if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
- if (write && read == 0) {
- read = 1;
- write = false;
- lockObj.isLocked = false;
- lockObj.badge.isValid = false;
- spinLock.store(false, std::memory_order_release);
- return LockObj<false>(selfWeakPtr, Badge{});
- } else {
- spinLock.store(false, std::memory_order_release);
+ bool expected;
+ while (true) {
+ expected = false;
+ if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
+ if (write && read == 0) {
+ read = 1;
+ write = false;
+ lockObj.isLocked = false;
+ lockObj.badge.isValid = false;
+ spinLock.store(false, std::memory_order_release);
+ return LockObj<false>(selfWeakPtr, Badge{});
+ } else {
+ spinLock.store(false, std::memory_order_release);
+ break;
+ }
}
}
}
UDPC::LockObj<true> UDPC::SharedSpinLock::try_trade_read_for_write_lock(UDPC::LockObj<false> &lockObj) {
if (lockObj.isValid() && lockObj.badge.isValid) {
- bool expected = false;
- if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
- if (!write && read == 1) {
- read = 0;
- write = true;
- lockObj.isLocked = false;
- lockObj.badge.isValid = false;
- spinLock.store(false, std::memory_order_release);
- return LockObj<true>(selfWeakPtr, Badge{});
- } else {
- spinLock.store(false, std::memory_order_release);
+ bool expected;
+ while (true) {
+ expected = false;
+ if (spinLock.compare_exchange_weak(expected, true, std::memory_order_acquire, std::memory_order_relaxed)) {
+ if (!write && read == 1) {
+ read = 0;
+ write = true;
+ lockObj.isLocked = false;
+ lockObj.badge.isValid = false;
+ spinLock.store(false, std::memory_order_release);
+ return LockObj<true>(selfWeakPtr, Badge{});
+ } else {
+ spinLock.store(false, std::memory_order_release);
+ break;
+ }
}
}
}