Change to_bytes_packed() to be more efficient

This commit is contained in:
Jason Paryani
2014-01-15 22:43:19 -08:00
parent 8c0e80529b
commit aa317e7324
4 changed files with 33 additions and 1 deletions

View File

@@ -1,5 +1,7 @@
from .capnp.includes.capnp_cpp cimport Maybe, DynamicStruct, Request, PyPromise, VoidPromise, PyPromiseArray, RemotePromise, DynamicCapability, InterfaceSchema, EnumSchema, StructSchema, DynamicValue, Capability, RpcSystem, MessageBuilder, MessageReader, TwoPartyVatNetwork, PyRestorer, AnyPointer, DynamicStruct_Builder
from .capnp.includes.schema_cpp cimport ByteArray
from non_circular cimport reraise_kj_exception
from cpython.ref cimport PyObject
@@ -30,3 +32,6 @@ cdef extern from "../helpers/rpcHelper.h":
Capability.Client restoreHelper(RpcSystem&, AnyPointer.Reader&)
Capability.Client restoreHelper(RpcSystem&, AnyPointer.Builder&)
RpcSystem makeRpcClientWithRestorer(TwoPartyVatNetwork&, PyRestorer&)
cdef extern from "../helpers/serialize.h":
ByteArray messageToPackedBytes(MessageBuilder &)

20
capnp/helpers/serialize.h Normal file
View File

@@ -0,0 +1,20 @@
#pragma once
#include "kj/io.h"
#include "capnp/dynamic.h"
#include "capnp/serialize-packed.h"
kj::Array< ::capnp::byte> messageToPackedBytes(capnp::MessageBuilder & message)
{
auto segments = message.getSegmentsForOutput();
size_t totalSize = segments.size() / 2 + 1;
for (auto& segment: segments) {
totalSize += segment.size();
}
kj::Array<capnp::byte> result = kj::heapArray<capnp::byte>(totalSize * 8);
kj::ArrayOutputStream out(result.asPtr());
capnp::writePackedMessage(out, message);
return heapArray(out.getArray()); // TODO: make this non-copying somehow
}