diff options
| author | Stefan Boberg <[email protected]> | 2021-05-13 17:37:32 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-05-13 17:37:32 +0200 |
| commit | 5d46e91942d81f6ca4d12225757e633013408369 (patch) | |
| tree | d14316239f40078a91cba3d867dddc2b6bec6e2b /zencore | |
| parent | Added string_view variant of WindowsException constructor (diff) | |
| download | zen-5d46e91942d81f6ca4d12225757e633013408369.tar.xz zen-5d46e91942d81f6ca4d12225757e633013408369.zip | |
Implemented move-in-place for large CAS payloads
Diffstat (limited to 'zencore')
| -rw-r--r-- | zencore/compactbinarypackage.cpp | 5 | ||||
| -rw-r--r-- | zencore/include/zencore/iobuffer.h | 3 | ||||
| -rw-r--r-- | zencore/include/zencore/sharedbuffer.h | 3 | ||||
| -rw-r--r-- | zencore/iobuffer.cpp | 35 |
4 files changed, 44 insertions, 2 deletions
diff --git a/zencore/compactbinarypackage.cpp b/zencore/compactbinarypackage.cpp index f84137ff6..262b6ecba 100644 --- a/zencore/compactbinarypackage.cpp +++ b/zencore/compactbinarypackage.cpp @@ -54,7 +54,10 @@ CbAttachment::CbAttachment(SharedBuffer InBuffer, const IoHash* const InHash) : Hash = *InHash; if (Buffer.GetSize()) { - ZEN_ASSERT_SLOW(Hash == IoHash::HashMemory(Buffer.GetData(), Buffer.GetSize())); + // This is disabled for now as it forces disk-based attachments to get mapped which + // then prevents us from making them delete themselves on close + + // ZEN_ASSERT_SLOW(Hash == IoHash::HashMemory(Buffer.GetData(), Buffer.GetSize())); } else { diff --git a/zencore/include/zencore/iobuffer.h b/zencore/include/zencore/iobuffer.h index f38af3c27..7e7182997 100644 --- a/zencore/include/zencore/iobuffer.h +++ b/zencore/include/zencore/iobuffer.h @@ -269,6 +269,8 @@ public: private: RefPtr<IoBufferCore> m_Core = new IoBufferCore; + IoBuffer(IoBufferCore* Core) : m_Core(Core) {} + friend class SharedBuffer; }; @@ -276,6 +278,7 @@ class IoBufferBuilder { public: ZENCORE_API static IoBuffer MakeFromFile(const wchar_t* FileName, uint64_t Offset = 0, uint64_t Size = ~0ull); + ZENCORE_API static IoBuffer MakeFromTemporaryFile(const wchar_t* FileName, uint64_t Offset = 0, uint64_t Size = ~0ull); ZENCORE_API static IoBuffer MakeFromFileHandle(void* FileHandle, uint64_t Offset = 0, uint64_t Size = ~0ull); inline static IoBuffer MakeCloneFromMemory(const void* Ptr, size_t Sz) { return IoBuffer(IoBuffer::Clone, Ptr, Sz); } diff --git a/zencore/include/zencore/sharedbuffer.h b/zencore/include/zencore/sharedbuffer.h index 7f9c61adb..cdcf66da4 100644 --- a/zencore/include/zencore/sharedbuffer.h +++ b/zencore/include/zencore/sharedbuffer.h @@ -101,7 +101,8 @@ public: } } - operator MemoryView() const { return GetView(); } + operator MemoryView() const { return GetView(); } + inline IoBuffer AsIoBuffer() const { return IoBuffer(m_Buffer); } SharedBuffer& operator=(UniqueBuffer&& Rhs) { diff --git a/zencore/iobuffer.cpp b/zencore/iobuffer.cpp index ec5d599b4..e74287c48 100644 --- a/zencore/iobuffer.cpp +++ b/zencore/iobuffer.cpp @@ -332,6 +332,41 @@ IoBufferBuilder::MakeFromFile(const wchar_t* FileName, uint64_t Offset, uint64_t return {}; } +IoBuffer +IoBufferBuilder::MakeFromTemporaryFile(const wchar_t* FileName, uint64_t Offset, uint64_t Size) +{ + CAtlFile DataFile; + + // We need to open with DELETE since this is used for the case + // when a file has been written to a staging directory, and is going + // to be moved in place. + + HRESULT hRes = DataFile.Create(FileName, GENERIC_READ | DELETE, FILE_SHARE_READ | FILE_SHARE_DELETE, OPEN_EXISTING); + + if (SUCCEEDED(hRes)) + { + ULONGLONG FileSize; + DataFile.GetSize(FileSize); + + if (Size == ~0ull) + { + Size = FileSize; + } + else + { + // Clamp size + if ((Offset + Size) > FileSize) + { + Size = FileSize - Offset; + } + } + + return IoBuffer(IoBuffer::File, DataFile.Detach(), Offset, Size); + } + + return {}; +} + ////////////////////////////////////////////////////////////////////////// void |