struct ProcessStream {
using CapnpMsg = capnp_utils::CapnpMessage<Bar>;
std::vector<std::shared_ptr<CapnpMsg>> data;
bool process_message(
kj::BufferedInputStreamWrapper& buffered_stream, kj::Array<capnp::word>& scratch
) {
capnp::InputStreamMessageReader reader(buffered_stream, capnp::ReaderOptions(), scratch.asPtr());
const auto ts_msg = reader.getRoot<Foo>();
auto mir_msg = ts_msg.getBar();
auto capnp_msg = std::make_shared<CapnpMsg>(mir_msg);
data.emplace_back(capnp_msg);
if (data.size() > 1000000) {
return false;
}
return true;
}
void start() {
// 1 MB of scratch.
kj::Array<capnp::word> scratch = kj::heapArray<capnp::word>(1024 * 1024 / sizeof(capnp::word));
kj::FdInputStream fd_stream(fileno(stdin));
kj::BufferedInputStreamWrapper buffered_stream(fd_stream);
while (buffered_stream.tryGetReadBuffer() != nullptr) {
if (!process_message(buffered_stream, scratch)) {
break;
}
}
}
};
void foo() {
ProcessStream stream;
stream.start();
std::cout << "A" << std::endl;
usleep(1000 * 1000 * 5);
stream.data.clear();
}
int main(int argc, char* argv[]) {
foo();
std::cout << "B" << std::endl;
usleep(1000 * 1000 * 10);
}
namespace capnp_utils {
/// 1 & 2 takes 10x more memory.
template<typename R>
class CapnpMessage2 {
// TODO: Should be private, but leave it public for debugging.
public:
typename R::Reader msg_reader;
std::unique_ptr<capnp::MallocMessageBuilder> msg_builder;
public:
CapnpMessage2(const typename R::Reader& reader) {
msg_builder = std::make_unique<capnp::MallocMessageBuilder>();
msg_builder->setRoot(reader);
msg_reader = msg_builder->getRoot<R>().asReader();
}
const typename R::Reader& get() const {
return msg_reader;
}
};
template<typename R>
class CapnpMessage1 {
public:
typename R::Reader struct_reader;
std::unique_ptr<capnp::MallocMessageBuilder> msg_builder;
public:
CapnpMessage1(const typename R::Reader& reader) {
capnp::MallocMessageBuilder tmp;
tmp.setRoot(reader);
const auto raw = capnp::messageToFlatArray(tmp);
msg_builder = std::make_unique<capnp::MallocMessageBuilder>();
capnp::initMessageBuilderFromFlatArrayCopy(raw, *msg_builder);
struct_reader = msg_builder->getRoot<R>().asReader();
}
const typename R::Reader& get() const {
return struct_reader;
}
};
template<typename R>
class CapnpMessage {
public:
typename R::Reader struct_reader;
// `struct_reader` is only valid when `msg_reader` is alive.
std::unique_ptr<capnp::FlatArrayMessageReader> msg_reader;
kj::Array<capnp::word> raw;
public:
CapnpMessage(const typename R::Reader& reader) {
capnp::MallocMessageBuilder msg_builder;
msg_builder.setRoot(reader);
raw = capnp::messageToFlatArray(msg_builder);
msg_reader = std::make_unique<capnp::FlatArrayMessageReader>(raw);
struct_reader = msg_reader->getRoot<R>();
}
const typename R::Reader& get() const {
return struct_reader;
}
};
}--
You received this message because you are subscribed to the Google Groups "Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email to capnproto+...@googlegroups.com.
Visit this group at https://groups.google.com/group/capnproto.
To unsubscribe from this group and stop receiving emails from it, send an email to capn...@googlegroups.com.