45 lines
944 B
C++
45 lines
944 B
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();
|
|
}
|
|
|
|
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();
|
|
}
|