diff options
| author | Dan Engelbrecht <[email protected]> | 2022-03-23 00:02:39 +0100 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2022-03-31 11:29:27 +0200 |
| commit | c99a64ed2ee559c1e720e85babec4bb8ba82d09a (patch) | |
| tree | c1f06238ed869d5e5ead0e2e132820afcce890b2 /zenstore/compactcas.cpp | |
| parent | Move FormatHex and ParseHex to zencore/string (diff) | |
| download | zen-c99a64ed2ee559c1e720e85babec4bb8ba82d09a.tar.xz zen-c99a64ed2ee559c1e720e85babec4bb8ba82d09a.zip | |
Use simpler locking for ChunkFile
Diffstat (limited to 'zenstore/compactcas.cpp')
| -rw-r--r-- | zenstore/compactcas.cpp | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/zenstore/compactcas.cpp b/zenstore/compactcas.cpp index d7929e42a..c49bfc8bf 100644 --- a/zenstore/compactcas.cpp +++ b/zenstore/compactcas.cpp @@ -74,8 +74,8 @@ struct CasContainerStrategy::ChunkBlock void StreamByteRange(uint64_t FileOffset, uint64_t Size, std::function<void(const void* Data, uint64_t Size)>&& ChunkFun); private: + void InternalOpen(); const std::filesystem::path m_Path; - std::atomic<bool> m_IsOpened; RwLock m_OpenLock; BasicFile m_File; IoBuffer m_IoBuffer; @@ -87,10 +87,8 @@ CasContainerStrategy::ChunkBlock::ChunkBlock(const std::filesystem::path& BlockP CasContainerStrategy::ChunkBlock::~ChunkBlock() { - if (m_IsOpened.load(std::memory_order_acquire)) - { - m_File.Detach(); - } + RwLock::ExclusiveLockScope _(m_OpenLock); + m_File.Detach(); } const std::filesystem::path& @@ -100,31 +98,28 @@ CasContainerStrategy::ChunkBlock::GetPath() const } void -CasContainerStrategy::ChunkBlock::Open() +CasContainerStrategy::ChunkBlock::InternalOpen() { - // Open can have a race if multiple requests wants to read the same block - // Create or ~ChunkBlock() can not have a race so we only need to guard Open() - if (m_IsOpened.load(std::memory_order_acquire)) - { - return; - } - - RwLock::ExclusiveLockScope _(m_OpenLock); - if (m_IsOpened.load(std::memory_order_acquire)) + if (m_File.Handle()) { return; } - m_File.Open(m_Path, false); void* FileHandle = m_File.Handle(); m_IoBuffer = IoBuffer(IoBuffer::File, FileHandle, 0, m_File.FileSize()); - m_IsOpened.store(true, std::memory_order_release); +} + +void +CasContainerStrategy::ChunkBlock::Open() +{ + RwLock::ExclusiveLockScope _(m_OpenLock); + InternalOpen(); } void CasContainerStrategy::ChunkBlock::Create(uint64_t InitialSize) { - ZEN_ASSERT(!m_IsOpened.load(std::memory_order_acquire)); + RwLock::ExclusiveLockScope _(m_OpenLock); auto ParentPath = m_Path.parent_path(); if (!std::filesystem::is_directory(ParentPath)) @@ -139,13 +134,12 @@ CasContainerStrategy::ChunkBlock::Create(uint64_t InitialSize) } void* FileHandle = m_File.Handle(); m_IoBuffer = IoBuffer(IoBuffer::File, FileHandle, 0, InitialSize); - m_IsOpened.store(true, std::memory_order_release); } uint64_t CasContainerStrategy::ChunkBlock::FileSize() { - ZEN_ASSERT(m_IsOpened.load(std::memory_order_acquire)); + RwLock::SharedLockScope _(m_OpenLock); return m_File.FileSize(); } @@ -153,7 +147,7 @@ void CasContainerStrategy::ChunkBlock::MarkAsDeleteOnClose(std::error_code& Ec) { RwLock::ExclusiveLockScope _(m_OpenLock); - if (m_IsOpened.load(std::memory_order::memory_order_acquire)) + if (m_File.Handle()) { m_File.MarkAsDeleteOnClose(Ec); return; @@ -168,28 +162,29 @@ CasContainerStrategy::ChunkBlock::MarkAsDeleteOnClose(std::error_code& Ec) IoBuffer CasContainerStrategy::ChunkBlock::GetChunk(uint64_t Offset, uint64_t Size) { - Open(); + InternalOpen(); return IoBuffer(m_IoBuffer, Offset, Size); } void CasContainerStrategy::ChunkBlock::Read(void* Data, uint64_t Size, uint64_t FileOffset) { - ZEN_ASSERT(m_IsOpened.load(std::memory_order_acquire)); + RwLock::SharedLockScope _(m_OpenLock); m_File.Read(Data, Size, FileOffset); } void CasContainerStrategy::ChunkBlock::Write(const void* Data, uint64_t Size, uint64_t FileOffset) { - ZEN_ASSERT(m_IsOpened.load(std::memory_order_acquire)); + RwLock::SharedLockScope _(m_OpenLock); m_File.Write(Data, Size, FileOffset); } void CasContainerStrategy::ChunkBlock::Flush() { - if (!m_IsOpened.load(std::memory_order_acquire)) + RwLock::ExclusiveLockScope _(m_OpenLock); + if (!m_File.Handle()) { return; } @@ -201,7 +196,7 @@ CasContainerStrategy::ChunkBlock::StreamByteRange(uint64_t FileOffse uint64_t Size, std::function<void(const void* Data, uint64_t Size)>&& ChunkFun) { - ZEN_ASSERT(m_IsOpened.load(std::memory_order_acquire)); + RwLock::SharedLockScope _(m_OpenLock); m_File.StreamByteRange(FileOffset, Size, std::move(ChunkFun)); } |