#include "shared_mutex.h" #include "core/error/error_macros.h" void SharedMutex::lock_shared() { this->lock.lock(); this->shared_count++; this->lock.unlock(); } void SharedMutex::unlock_shared() { this->lock.lock(); this->shared_count--; ERR_FAIL_COND_EDMSG(this->shared_count < 0, "SharedMutex::unlock_shared, shared_count < 0"); this->lock.unlock(); } void SharedMutex::lock_exclusive() { while (true) { this->lock.lock(); if (this->shared_count == 0) { return; } this->lock.unlock(); } } void SharedMutex::unlock_exclusive() { this->lock.unlock(); } bool SharedMutex::is_locked() { if (this->lock.try_lock()) { bool locked{ this->shared_count != 0 }; this->lock.unlock(); return locked; } else { return false; } } SharedMutex::LockExclusive::LockExclusive(SharedMutex &mutex) : mtx{ mutex } { this->mtx.lock_exclusive(); } SharedMutex::LockExclusive::~LockExclusive() { this->mtx.unlock_exclusive(); } SharedMutex::LockShared::LockShared(SharedMutex &mutex) : mtx{ mutex } { this->mtx.lock_shared(); } SharedMutex::LockShared::~LockShared() { this->mtx.unlock_shared(); }