From 12928cdae2e21f59211b19cfe40e432506576212 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 8 Mar 2021 18:02:21 +0800 Subject: [PATCH] use cached buffer for FlatArrayMessageReader (#20233) --- selfdrive/boardd/boardd.cc | 11 +++++++---- selfdrive/locationd/ubloxd_main.cc | 12 +++++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index 5b82b023bc..dd3690db0e 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -199,6 +199,7 @@ void can_recv(PubMaster &pm) { void can_send_thread(bool fake_send) { LOGD("start send thread"); + kj::Array buf = kj::heapArray(1024); Context * context = Context::create(); SubSocket * subscriber = SubSocket::create(context, "sendcan"); assert(subscriber != NULL); @@ -214,11 +215,13 @@ void can_send_thread(bool fake_send) { } continue; } + const size_t size = (msg->getSize() / sizeof(capnp::word)) + 1; + if (buf.size() < size) { + buf = kj::heapArray(size); + } + memcpy(buf.begin(), msg->getData(), msg->getSize()); - auto amsg = kj::heapArray((msg->getSize() / sizeof(capnp::word)) + 1); - memcpy(amsg.begin(), msg->getData(), msg->getSize()); - - capnp::FlatArrayMessageReader cmsg(amsg); + capnp::FlatArrayMessageReader cmsg(buf.slice(0, size)); cereal::Event::Reader event = cmsg.getRoot(); //Dont send if older than 1 second diff --git a/selfdrive/locationd/ubloxd_main.cc b/selfdrive/locationd/ubloxd_main.cc index 51924f6441..3ebc437a1d 100644 --- a/selfdrive/locationd/ubloxd_main.cc +++ b/selfdrive/locationd/ubloxd_main.cc @@ -23,7 +23,7 @@ ExitHandler do_exit; using namespace ublox; int ubloxd_main(poll_ubloxraw_msg_func poll_func, send_gps_event_func send_func) { LOGW("starting ubloxd"); - + kj::Array buf = kj::heapArray(1024); UbloxMsgParser parser; Context * context = Context::create(); @@ -41,11 +41,13 @@ int ubloxd_main(poll_ubloxraw_msg_func poll_func, send_gps_event_func send_func) } continue; } + const size_t size = (msg->getSize() / sizeof(capnp::word)) + 1; + if (buf.size() < size) { + buf = kj::heapArray(size); + } + memcpy(buf.begin(), msg->getData(), msg->getSize()); - auto amsg = kj::heapArray((msg->getSize() / sizeof(capnp::word)) + 1); - memcpy(amsg.begin(), msg->getData(), msg->getSize()); - - capnp::FlatArrayMessageReader cmsg(amsg); + capnp::FlatArrayMessageReader cmsg(buf.slice(0, size)); cereal::Event::Reader event = cmsg.getRoot(); auto ubloxRaw = event.getUbloxRaw();