use cached buffer for FlatArrayMessageReader (#20233)

pull/20276/head
Dean Lee 4 years ago committed by GitHub
parent 6e1730a3e8
commit 12928cdae2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 11
      selfdrive/boardd/boardd.cc
  2. 12
      selfdrive/locationd/ubloxd_main.cc

@ -199,6 +199,7 @@ void can_recv(PubMaster &pm) {
void can_send_thread(bool fake_send) { void can_send_thread(bool fake_send) {
LOGD("start send thread"); LOGD("start send thread");
kj::Array<capnp::word> buf = kj::heapArray<capnp::word>(1024);
Context * context = Context::create(); Context * context = Context::create();
SubSocket * subscriber = SubSocket::create(context, "sendcan"); SubSocket * subscriber = SubSocket::create(context, "sendcan");
assert(subscriber != NULL); assert(subscriber != NULL);
@ -214,11 +215,13 @@ void can_send_thread(bool fake_send) {
} }
continue; continue;
} }
const size_t size = (msg->getSize() / sizeof(capnp::word)) + 1;
if (buf.size() < size) {
buf = kj::heapArray<capnp::word>(size);
}
memcpy(buf.begin(), msg->getData(), msg->getSize());
auto amsg = kj::heapArray<capnp::word>((msg->getSize() / sizeof(capnp::word)) + 1); capnp::FlatArrayMessageReader cmsg(buf.slice(0, size));
memcpy(amsg.begin(), msg->getData(), msg->getSize());
capnp::FlatArrayMessageReader cmsg(amsg);
cereal::Event::Reader event = cmsg.getRoot<cereal::Event>(); cereal::Event::Reader event = cmsg.getRoot<cereal::Event>();
//Dont send if older than 1 second //Dont send if older than 1 second

@ -23,7 +23,7 @@ ExitHandler do_exit;
using namespace ublox; using namespace ublox;
int ubloxd_main(poll_ubloxraw_msg_func poll_func, send_gps_event_func send_func) { int ubloxd_main(poll_ubloxraw_msg_func poll_func, send_gps_event_func send_func) {
LOGW("starting ubloxd"); LOGW("starting ubloxd");
kj::Array<capnp::word> buf = kj::heapArray<capnp::word>(1024);
UbloxMsgParser parser; UbloxMsgParser parser;
Context * context = Context::create(); Context * context = Context::create();
@ -41,11 +41,13 @@ int ubloxd_main(poll_ubloxraw_msg_func poll_func, send_gps_event_func send_func)
} }
continue; continue;
} }
const size_t size = (msg->getSize() / sizeof(capnp::word)) + 1;
if (buf.size() < size) {
buf = kj::heapArray<capnp::word>(size);
}
memcpy(buf.begin(), msg->getData(), msg->getSize());
auto amsg = kj::heapArray<capnp::word>((msg->getSize() / sizeof(capnp::word)) + 1); capnp::FlatArrayMessageReader cmsg(buf.slice(0, size));
memcpy(amsg.begin(), msg->getData(), msg->getSize());
capnp::FlatArrayMessageReader cmsg(amsg);
cereal::Event::Reader event = cmsg.getRoot<cereal::Event>(); cereal::Event::Reader event = cmsg.getRoot<cereal::Event>();
auto ubloxRaw = event.getUbloxRaw(); auto ubloxRaw = event.getUbloxRaw();

Loading…
Cancel
Save