Current section
Files
Jump to
Current section
Files
c_src/duckdb/src/storage/storage_lock.cpp
#include "duckdb/storage/storage_lock.hpp"
#include "duckdb/common/common.hpp"
#include "duckdb/common/assert.hpp"
namespace duckdb {
StorageLockKey::StorageLockKey(StorageLock &lock, StorageLockType type) : lock(lock), type(type) {
}
StorageLockKey::~StorageLockKey() {
if (type == StorageLockType::EXCLUSIVE) {
lock.ReleaseExclusiveLock();
} else {
D_ASSERT(type == StorageLockType::SHARED);
lock.ReleaseSharedLock();
}
}
StorageLock::StorageLock() : read_count(0) {
}
unique_ptr<StorageLockKey> StorageLock::GetExclusiveLock() {
exclusive_lock.lock();
while (read_count != 0) {
}
return make_unique<StorageLockKey>(*this, StorageLockType::EXCLUSIVE);
}
unique_ptr<StorageLockKey> StorageLock::GetSharedLock() {
exclusive_lock.lock();
read_count++;
exclusive_lock.unlock();
return make_unique<StorageLockKey>(*this, StorageLockType::SHARED);
}
void StorageLock::ReleaseExclusiveLock() {
exclusive_lock.unlock();
}
void StorageLock::ReleaseSharedLock() {
read_count--;
}
} // namespace duckdb