//===----------------------------------------------------------------------===// // DuckDB // // duckdb/storage/storage_lock.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/constants.hpp" #include "duckdb/common/atomic.hpp" #include "duckdb/common/mutex.hpp" namespace duckdb { class StorageLock; enum class StorageLockType { SHARED = 0, EXCLUSIVE = 1 }; class StorageLockKey { public: StorageLockKey(StorageLock &lock, StorageLockType type); ~StorageLockKey(); private: StorageLock &lock; StorageLockType type; }; class StorageLock { friend class StorageLockKey; public: StorageLock(); //! Get an exclusive lock unique_ptr GetExclusiveLock(); //! Get a shared lock unique_ptr GetSharedLock(); private: mutex exclusive_lock; atomic read_count; private: //! Release an exclusive lock void ReleaseExclusiveLock(); //! Release a shared lock void ReleaseSharedLock(); }; } // namespace duckdb