replay: allocate events in contiguous memory pool (#22535)

* memory pool

* reserve events too

* remove dctor

* cleanup

* move pool into class LogReader

* cleanup include
old-commit-hash: 94b3d4d267
commatwo_master
Dean Lee 4 years ago committed by GitHub
parent 5afb4b9731
commit e88d98223b
  1. 19
      selfdrive/ui/replay/logreader.cc
  2. 15
      selfdrive/ui/replay/logreader.h

@ -27,8 +27,17 @@ Event::Event(const kj::ArrayPtr<const capnp::word> &amsg, bool frame) : reader(a
// class LogReader // class LogReader
LogReader::LogReader(size_t memory_pool_block_size) {
const size_t buf_size = sizeof(Event) * memory_pool_block_size;
pool_buffer_ = ::operator new(buf_size);
mbr_ = new std::pmr::monotonic_buffer_resource(pool_buffer_, buf_size);
events.reserve(memory_pool_block_size);
}
LogReader::~LogReader() { LogReader::~LogReader() {
for (auto e : events) delete e; delete mbr_;
::operator delete(pool_buffer_);
} }
bool LogReader::load(const std::string &file) { bool LogReader::load(const std::string &file) {
@ -47,19 +56,19 @@ bool LogReader::load(const std::string &file) {
kj::ArrayPtr<const capnp::word> words((const capnp::word *)raw_.data(), raw_.size() / sizeof(capnp::word)); kj::ArrayPtr<const capnp::word> words((const capnp::word *)raw_.data(), raw_.size() / sizeof(capnp::word));
while (words.size() > 0) { while (words.size() > 0) {
try { try {
std::unique_ptr<Event> evt = std::make_unique<Event>(words); Event *evt = new (mbr_) Event(words);
// Add encodeIdx packet again as a frame packet for the video stream // Add encodeIdx packet again as a frame packet for the video stream
if (evt->which == cereal::Event::ROAD_ENCODE_IDX || if (evt->which == cereal::Event::ROAD_ENCODE_IDX ||
evt->which == cereal::Event::DRIVER_ENCODE_IDX || evt->which == cereal::Event::DRIVER_ENCODE_IDX ||
evt->which == cereal::Event::WIDE_ROAD_ENCODE_IDX) { evt->which == cereal::Event::WIDE_ROAD_ENCODE_IDX) {
std::unique_ptr<Event> frame_evt = std::make_unique<Event>(words, true); Event *frame_evt = new (mbr_) Event(words, true);
events.push_back(frame_evt.release()); events.push_back(frame_evt);
} }
words = kj::arrayPtr(evt->reader.getEnd(), words.end()); words = kj::arrayPtr(evt->reader.getEnd(), words.end());
events.push_back(evt.release()); events.push_back(evt);
} catch (const kj::Exception &e) { } catch (const kj::Exception &e) {
return false; return false;
} }

@ -1,11 +1,13 @@
#pragma once #pragma once
#include <capnp/serialize.h> #include <memory_resource>
#include "cereal/gen/cpp/log.capnp.h" #include "cereal/gen/cpp/log.capnp.h"
#include "selfdrive/camerad/cameras/camera_common.h" #include "selfdrive/camerad/cameras/camera_common.h"
const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam}; const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam};
const int MAX_CAMERAS = std::size(ALL_CAMERAS); const int MAX_CAMERAS = std::size(ALL_CAMERAS);
const int DEFAULT_EVENT_MEMORY_POOL_BLOCK_SIZE = 65000;
class Event { class Event {
public: public:
@ -23,6 +25,13 @@ public:
} }
}; };
void *operator new(size_t size, std::pmr::monotonic_buffer_resource *mbr) {
return mbr->allocate(size);
}
void operator delete(void *ptr) {
// No-op. memory used by EventMemoryPool increases monotonically until the logReader is destroyed.
}
uint64_t mono_time; uint64_t mono_time;
cereal::Event::Which which; cereal::Event::Which which;
cereal::Event::Reader event; cereal::Event::Reader event;
@ -33,7 +42,7 @@ public:
class LogReader { class LogReader {
public: public:
LogReader() = default; LogReader(size_t memory_pool_block_size = DEFAULT_EVENT_MEMORY_POOL_BLOCK_SIZE);
~LogReader(); ~LogReader();
bool load(const std::string &file); bool load(const std::string &file);
@ -41,4 +50,6 @@ public:
private: private:
std::string raw_; std::string raw_;
std::pmr::monotonic_buffer_resource *mbr_ = nullptr;
void *pool_buffer_ = nullptr;
}; };

Loading…
Cancel
Save