Additional context I forgot to include. I'm getting identical output with just a naive capnp::writeMessageToFd on the original builder. In the sample I'm looking at I only ever write 1 message. The conversion using the capnp decode tool fails with:
*** ERROR CONVERTING PREVIOUS MESSAGE *** The following error occurred while converting the message above. This probably means the input data is invalid/corrupted. Exception description: expected ref->kind() == WirePointer::STRUCT; Message contains non-struct pointer where struct pointer was expected. Code location: capnp/layout.c++:2168 *** END ERROR *** On Tue, May 12, 2020 at 5:38 PM Vitali Lovich <[email protected]> wrote: > I'm having a weird problem that I'm suspecting comes from invalid usage of > the API? > Basically I offload the serialized message (obtained via > capnp::messageToFlatArray) to a background thread for appending to a file. > However, I'm noticing that the messages are corrupt. I'm wondering if I'm > misusing the API in some obvious way? AFAICT writing the output of > messageToFlatArray should be identical to sending it to an OutputStream... > > Hopefully it's not a glaring oversight on my part like the past couple of > messages. > > Pseudo-code below: > > void append(capnp::MessageBuilder& builder) { > auto serializedInWords = capnp::messageToFlatArray(builder); > { > std::lock_guard lg(mutex_); > queue_.emplace_back(kj::mv(serializedInWords)); > } > available_.notify_all(); > } > > void flushThread() { > std::vector<kj::Array<const capnp::word>> toFlush; > > // output_ is kj::AutoCloseFd - the thread RAII joins on destruction & > is declared after output_ so the I/O should outlive > // also the problematic message is one that I write once on start & the > I/O gets terminated much later so I don't think it's a race for the I/O. > kj::FdOutputStream output(output_.get()); > > do { > { > std::unique_lock lck(available_); > available_.wait(lck, [&] { return terminated_ || !queue_.empty()); > toFlush = std::move(queue_); > } > for (const auto& message : toFlush) { > auto messageBytes = message.asBytes(); > output.write(messageBytes.begin(), messageBytes.size()); > } > } while (!terminated_); > } > -- 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 [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/capnproto/CAF8PYMgW5Ofge1FCJ1%2BNvS8gS0RrnGOWfvvtxfsr1kZUS0HR1g%40mail.gmail.com.
