terrain-module/shared_mutex.cpp
2026-04-19 14:56:17 +02:00

55 lines
1.1 KiB
C++

#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();
}