aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/packageformat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenutil/packageformat.cpp')
-rw-r--r--src/zenutil/packageformat.cpp62
1 files changed, 27 insertions, 35 deletions
diff --git a/src/zenutil/packageformat.cpp b/src/zenutil/packageformat.cpp
index 963a442cd..8087b7564 100644
--- a/src/zenutil/packageformat.cpp
+++ b/src/zenutil/packageformat.cpp
@@ -45,17 +45,7 @@ FormatPackageMessageBuffer(const CbPackage& Data, void* TargetProcessHandle)
CompositeBuffer
FormatPackageMessageBuffer(const CbPackage& Data, FormatFlags Flags, void* TargetProcessHandle)
{
- std::vector<IoBuffer> Message = FormatPackageMessage(Data, Flags, TargetProcessHandle);
-
- std::vector<SharedBuffer> Buffers;
-
- for (IoBuffer& Buf : Message)
- {
- ZEN_ASSERT(Buf.GetSize() > 0);
- Buffers.push_back(SharedBuffer(Buf));
- }
-
- return CompositeBuffer(std::move(Buffers));
+ return CompositeBuffer(FormatPackageMessage(Data, Flags, TargetProcessHandle));
}
static void
@@ -76,7 +66,7 @@ MarshalLocal(CbAttachmentEntry*& AttachmentInfo,
.Flags = (IsCompressed ? uint32_t(CbAttachmentEntry::kIsCompressed) : 0u) | CbAttachmentEntry::kIsLocalRef,
.AttachmentHash = AttachmentHash};
- ResponseBuffers.push_back(std::move(RefBuffer));
+ ResponseBuffers.emplace_back(std::move(RefBuffer));
};
static bool
@@ -182,29 +172,27 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce
const std::span<const CbAttachment>& Attachments = Data.GetAttachments();
std::vector<IoBuffer> ResponseBuffers;
- ResponseBuffers.reserve(3 + Attachments.size()); // TODO: may want to use an additional fudge factor here to avoid growing since each
+ ResponseBuffers.reserve(2 + Attachments.size()); // TODO: may want to use an additional fudge factor here to avoid growing since each
// attachment is likely to consist of several buffers
+ IoBuffer AttachmentMetadataBuffer = IoBuffer{sizeof(CbPackageHeader) + sizeof(CbAttachmentEntry) * (Attachments.size() + /* root */ 1)};
+ MutableMemoryView HeaderView = AttachmentMetadataBuffer.GetMutableView();
// Fixed size header
- CbPackageHeader Hdr{.HeaderMagic = kCbPkgMagic, .AttachmentCount = gsl::narrow<uint32_t>(Attachments.size())};
-
- ResponseBuffers.push_back(IoBufferBuilder::MakeCloneFromMemory(&Hdr, sizeof Hdr));
+ CbPackageHeader* Hdr = (CbPackageHeader*)HeaderView.GetData();
+ *Hdr = {.HeaderMagic = kCbPkgMagic, .AttachmentCount = gsl::narrow<uint32_t>(Attachments.size())};
+ HeaderView.MidInline(sizeof(CbPackageHeader));
// Attachment metadata array
-
- IoBuffer AttachmentMetadataBuffer = IoBuffer{sizeof(CbAttachmentEntry) * (Attachments.size() + /* root */ 1)};
- CbAttachmentEntry* AttachmentInfo = reinterpret_cast<CbAttachmentEntry*>(AttachmentMetadataBuffer.MutableData());
-
- ResponseBuffers.push_back(AttachmentMetadataBuffer); // Attachment metadata
+ CbAttachmentEntry* AttachmentInfo = reinterpret_cast<CbAttachmentEntry*>(HeaderView.GetData());
+ ResponseBuffers.emplace_back(std::move(AttachmentMetadataBuffer)); // Attachment metadata
// Root object
IoBuffer RootIoBuffer = Data.GetObject().GetBuffer().AsIoBuffer();
ZEN_ASSERT(RootIoBuffer.GetSize() > 0);
- ResponseBuffers.push_back(RootIoBuffer); // Root object
-
*AttachmentInfo++ = {.PayloadSize = RootIoBuffer.Size(), .Flags = CbAttachmentEntry::kIsObject, .AttachmentHash = Data.GetObjectHash()};
+ ResponseBuffers.emplace_back(std::move(RootIoBuffer)); // Root object
// Attachment payloads
tsl::robin_map<void*, std::string> FileNameMap;
@@ -215,10 +203,10 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce
{
ZEN_NOT_IMPLEMENTED("Null attachments are not supported");
}
- else if (CompressedBuffer AttachmentBuffer = Attachment.AsCompressedBinary())
+ else if (const CompressedBuffer& AttachmentBuffer = Attachment.AsCompressedBinary())
{
- CompositeBuffer Compressed = AttachmentBuffer.GetCompressed();
- IoHash AttachmentHash = Attachment.GetHash();
+ const CompositeBuffer& Compressed = AttachmentBuffer.GetCompressed();
+ IoHash AttachmentHash = Attachment.GetHash();
// If the data is either not backed by a file, or there are multiple
// fragments then we cannot marshal it by local reference. We might
@@ -257,10 +245,12 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce
.Flags = CbAttachmentEntry::kIsCompressed,
.AttachmentHash = AttachmentHash};
- for (const SharedBuffer& Segment : Compressed.GetSegments())
+ std::span<const SharedBuffer> Segments = Compressed.GetSegments();
+ ResponseBuffers.reserve(ResponseBuffers.size() + Segments.size() - 1);
+ for (const SharedBuffer& Segment : Segments)
{
ZEN_ASSERT(Segment.GetSize() > 0);
- ResponseBuffers.push_back(Segment.AsIoBuffer());
+ ResponseBuffers.emplace_back(Segment.AsIoBuffer());
}
}
}
@@ -268,13 +258,13 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce
{
IoBuffer ObjIoBuffer = AttachmentObject.GetBuffer().AsIoBuffer();
ZEN_ASSERT(ObjIoBuffer.GetSize() > 0);
- ResponseBuffers.push_back(ObjIoBuffer);
+ ResponseBuffers.emplace_back(std::move(ObjIoBuffer));
*AttachmentInfo++ = {.PayloadSize = ObjIoBuffer.Size(),
.Flags = CbAttachmentEntry::kIsObject,
.AttachmentHash = Attachment.GetHash()};
}
- else if (CompositeBuffer AttachmentBinary = Attachment.AsCompositeBinary())
+ else if (const CompositeBuffer& AttachmentBinary = Attachment.AsCompositeBinary())
{
IoHash AttachmentHash = Attachment.GetHash();
bool MarshalByLocalRef =
@@ -309,10 +299,12 @@ FormatPackageMessage(const CbPackage& Data, FormatFlags Flags, void* TargetProce
{
*AttachmentInfo++ = {.PayloadSize = AttachmentBinary.GetSize(), .Flags = 0, .AttachmentHash = Attachment.GetHash()};
- for (const SharedBuffer& Segment : AttachmentBinary.GetSegments())
+ std::span<const SharedBuffer> Segments = AttachmentBinary.GetSegments();
+ ResponseBuffers.reserve(ResponseBuffers.size() + Segments.size() - 1);
+ for (const SharedBuffer& Segment : Segments)
{
ZEN_ASSERT(Segment.GetSize() > 0);
- ResponseBuffers.push_back(Segment.AsIoBuffer());
+ ResponseBuffers.emplace_back(Segment.AsIoBuffer());
}
}
}
@@ -640,7 +632,7 @@ CbPackageReader::ProcessPackageHeaderData(const void* Data, uint64_t DataBytes)
// the caller will need to handle the payload differently (i.e it's a
// CbAttachmentReferenceHeader not the actual payload)
- m_PayloadBuffers.push_back(IoBuffer{Entry.PayloadSize});
+ m_PayloadBuffers.emplace_back(IoBuffer{Entry.PayloadSize});
}
m_CurrentState = State::kReadingBuffers;
@@ -738,14 +730,14 @@ CbPackageReader::Finalize()
CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(ChunkReference), RawHash, RawSize);
if (RawHash == Entry.AttachmentHash)
{
- m_Attachments.push_back(CbAttachment(Compressed, Entry.AttachmentHash));
+ m_Attachments.emplace_back(CbAttachment(Compressed, Entry.AttachmentHash));
}
}
else
{
CompressedBuffer Compressed =
CompressedBuffer::Compress(SharedBuffer(ChunkReference), OodleCompressor::NotSet, OodleCompressionLevel::None);
- m_Attachments.push_back(CbAttachment(std::move(Compressed), Compressed.DecodeRawHash()));
+ m_Attachments.emplace_back(CbAttachment(std::move(Compressed), Compressed.DecodeRawHash()));
}
}