aboutsummaryrefslogtreecommitdiff
path: root/zencore/sharedbuffer.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-05-13 12:01:18 +0200
committerStefan Boberg <[email protected]>2021-05-13 12:01:18 +0200
commit0b8280d4fcbf3a65997c3cc86cf14f5f7c44b7fe (patch)
tree5ce29b79d0636e8e127c68c9fb9928b67759d1ac /zencore/sharedbuffer.cpp
parentclang-format (diff)
downloadzen-0b8280d4fcbf3a65997c3cc86cf14f5f7c44b7fe.tar.xz
zen-0b8280d4fcbf3a65997c3cc86cf14f5f7c44b7fe.zip
Made SharedBuffer/UniqueBuffer share guts with IoBuffer
This enables way more efficient marshaling of compact binary objects and attachments
Diffstat (limited to 'zencore/sharedbuffer.cpp')
-rw-r--r--zencore/sharedbuffer.cpp49
1 files changed, 24 insertions, 25 deletions
diff --git a/zencore/sharedbuffer.cpp b/zencore/sharedbuffer.cpp
index bc991053d..db6deff38 100644
--- a/zencore/sharedbuffer.cpp
+++ b/zencore/sharedbuffer.cpp
@@ -10,68 +10,65 @@
namespace zen {
-BufferOwner::~BufferOwner()
-{
- if (m_IsOwned)
- {
- Memory::Free(m_Data);
- }
-}
-
//////////////////////////////////////////////////////////////////////////
UniqueBuffer
UniqueBuffer::Alloc(uint64_t Size)
{
- void* Buffer = Memory::Alloc(Size, 16);
- BufferOwner* Owner = new BufferOwner(Buffer, Size, /* owned */ true);
+ void* Buffer = Memory::Alloc(Size, 16);
+ IoBufferCore* Owner = new IoBufferCore(Buffer, Size);
+ Owner->SetIsOwnedByThis(true);
+ Owner->SetIsImmutable(false);
return UniqueBuffer(Owner);
}
UniqueBuffer
-UniqueBuffer::MakeView(void* DataPtr, uint64_t Size)
+UniqueBuffer::MakeMutableView(void* DataPtr, uint64_t Size)
{
- return UniqueBuffer(new BufferOwner(DataPtr, Size, /* owned */ false));
+ IoBufferCore* Owner = new IoBufferCore(DataPtr, Size);
+ Owner->SetIsImmutable(false);
+ return UniqueBuffer(Owner);
}
-UniqueBuffer::UniqueBuffer(BufferOwner* Owner) : m_buffer(Owner)
+UniqueBuffer::UniqueBuffer(IoBufferCore* Owner) : m_Buffer(Owner)
{
}
//////////////////////////////////////////////////////////////////////////
-SharedBuffer::SharedBuffer(UniqueBuffer&& InBuffer) : m_buffer(std::move(InBuffer.m_buffer))
+SharedBuffer::SharedBuffer(UniqueBuffer&& InBuffer) : m_Buffer(std::move(InBuffer.m_Buffer))
{
}
void
SharedBuffer::MakeOwned()
{
- if (IsOwned() || !m_buffer)
+ if (IsOwned() || !m_Buffer)
return;
- const uint64_t Size = m_buffer->m_Size;
+ const uint64_t Size = m_Buffer->DataBytes();
void* Buffer = Memory::Alloc(Size, 16);
- auto NewOwner = new BufferOwner(Buffer, Size, /* owned */ true);
+ auto NewOwner = new IoBufferCore(Buffer, Size);
+ NewOwner->SetIsOwnedByThis(true);
- memcpy(Buffer, m_buffer->m_Data, Size);
+ memcpy(Buffer, m_Buffer->DataPointer(), Size);
- m_buffer = NewOwner;
+ m_Buffer = NewOwner;
}
SharedBuffer
-SharedBuffer::MakeView(MemoryView View, SharedBuffer Buffer)
+SharedBuffer::MakeView(MemoryView View, SharedBuffer OuterBuffer)
{
// Todo: verify that view is within the shared buffer
- return SharedBuffer(new BufferOwner(const_cast<void*>(View.GetData()), View.GetSize(), /* owned */ false, Buffer.m_buffer));
+ return SharedBuffer(new IoBufferCore(OuterBuffer.m_Buffer, const_cast<void*>(View.GetData()), View.GetSize()));
}
SharedBuffer
SharedBuffer::MakeView(const void* Data, uint64_t Size)
{
- return SharedBuffer(new BufferOwner(const_cast<void*>(Data), Size, /* owned */ false));
+ return SharedBuffer(new IoBufferCore(const_cast<void*>(Data), Size));
}
SharedBuffer
@@ -79,8 +76,9 @@ SharedBuffer::Clone()
{
const uint64_t Size = GetSize();
void* Buffer = Memory::Alloc(Size, 16);
- auto NewOwner = new BufferOwner(Buffer, Size, /* owned */ true);
- memcpy(Buffer, m_buffer->m_Data, Size);
+ auto NewOwner = new IoBufferCore(Buffer, Size);
+ NewOwner->SetIsOwnedByThis(true);
+ memcpy(Buffer, m_Buffer->DataPointer(), Size);
return SharedBuffer(NewOwner);
}
@@ -90,7 +88,8 @@ SharedBuffer::Clone(MemoryView View)
{
const uint64_t Size = View.GetSize();
void* Buffer = Memory::Alloc(Size, 16);
- auto NewOwner = new BufferOwner(Buffer, Size, /* owned */ true);
+ auto NewOwner = new IoBufferCore(Buffer, Size);
+ NewOwner->SetIsOwnedByThis(true);
memcpy(Buffer, View.GetData(), Size);
return SharedBuffer(NewOwner);