55 lines
1.1 KiB
C++
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();
|
|
}
|