#include "CXX11_shared_spin_lock.hpp" UDPC::Badge::Badge() : isValid(true) {} UDPC::SharedSpinLock::Ptr UDPC::SharedSpinLock::newInstance() { Ptr sharedSpinLock = Ptr(new SharedSpinLock()); sharedSpinLock->selfWeakPtr = sharedSpinLock; return sharedSpinLock; } UDPC::SharedSpinLock::SharedSpinLock() : selfWeakPtr(), mutex(), read(0), write(false) {} UDPC::LockObj UDPC::SharedSpinLock::spin_read_lock() { while (true) { std::lock_guard lock(mutex); if (!write.load()) { ++read; return LockObj(selfWeakPtr, Badge{}); } } } UDPC::LockObj UDPC::SharedSpinLock::try_spin_read_lock() { std::lock_guard lock(mutex); if (!write.load()) { ++read; return LockObj(selfWeakPtr, Badge{}); } return LockObj(Badge{}); } void UDPC::SharedSpinLock::read_unlock(UDPC::Badge &&badge) { if (badge.isValid) { std::lock_guard lock(mutex); if (read.load() > 0) { --read; badge.isValid = false; } } } UDPC::LockObj UDPC::SharedSpinLock::spin_write_lock() { while (true) { std::lock_guard lock(mutex); if (!write.load() && read.load() == 0) { write.store(true); return LockObj(selfWeakPtr, Badge{}); } } } UDPC::LockObj UDPC::SharedSpinLock::try_spin_write_lock() { std::lock_guard lock(mutex); if (!write.load() && read.load() == 0) { write.store(true); return LockObj(selfWeakPtr, Badge{}); } return LockObj(Badge{}); } void UDPC::SharedSpinLock::write_unlock(UDPC::Badge &&badge) { if (badge.isValid) { std::lock_guard lock(mutex); write.store(false); badge.isValid = false; } }