aboutsummaryrefslogtreecommitdiff
path: root/zencore
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-05-13 17:37:32 +0200
committerStefan Boberg <[email protected]>2021-05-13 17:37:32 +0200
commit5d46e91942d81f6ca4d12225757e633013408369 (patch)
treed14316239f40078a91cba3d867dddc2b6bec6e2b /zencore
parentAdded string_view variant of WindowsException constructor (diff)
downloadzen-5d46e91942d81f6ca4d12225757e633013408369.tar.xz
zen-5d46e91942d81f6ca4d12225757e633013408369.zip
Implemented move-in-place for large CAS payloads
Diffstat (limited to 'zencore')
-rw-r--r--zencore/compactbinarypackage.cpp5
-rw-r--r--zencore/include/zencore/iobuffer.h3
-rw-r--r--zencore/include/zencore/sharedbuffer.h3
-rw-r--r--zencore/iobuffer.cpp35
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