replay: use std::unique_ptr to manage memory, reuse events buffer. (#23049)

* reuse events buffer

* Trigger Build
old-commit-hash: 8a84263c2d
commatwo_master
Dean Lee 3 years ago committed by GitHub
parent 4754da9fbc
commit 066528dc2b
  1. 24
      selfdrive/ui/replay/replay.cc
  2. 5
      selfdrive/ui/replay/replay.h

@ -25,10 +25,11 @@ Replay::Replay(QString route, QStringList allow, QStringList block, SubMaster *s
qDebug() << "services " << s; qDebug() << "services " << s;
if (sm == nullptr) { if (sm == nullptr) {
pm = new PubMaster(s); pm = std::make_unique<PubMaster>(s);
} }
route_ = std::make_unique<Route>(route, data_dir); route_ = std::make_unique<Route>(route, data_dir);
events_ = new std::vector<Event *>(); events_ = std::make_unique<std::vector<Event *>>();
new_events_ = std::make_unique<std::vector<Event *>>();
connect(this, &Replay::seekTo, this, &Replay::doSeek); connect(this, &Replay::seekTo, this, &Replay::doSeek);
connect(this, &Replay::segmentChanged, this, &Replay::queueSegment); connect(this, &Replay::segmentChanged, this, &Replay::queueSegment);
@ -36,8 +37,6 @@ Replay::Replay(QString route, QStringList allow, QStringList block, SubMaster *s
Replay::~Replay() { Replay::~Replay() {
stop(); stop();
delete pm;
delete events_;
} }
void Replay::stop() { void Replay::stop() {
@ -181,28 +180,27 @@ void Replay::queueSegment() {
void Replay::mergeSegments(const SegmentMap::iterator &begin, const SegmentMap::iterator &end) { void Replay::mergeSegments(const SegmentMap::iterator &begin, const SegmentMap::iterator &end) {
// merge 3 segments in sequence. // merge 3 segments in sequence.
std::vector<int> segments_need_merge; std::vector<int> segments_need_merge;
size_t new_events_size = 0;
for (auto it = begin; it != end && it->second->isLoaded() && segments_need_merge.size() < 3; ++it) { for (auto it = begin; it != end && it->second->isLoaded() && segments_need_merge.size() < 3; ++it) {
segments_need_merge.push_back(it->first); segments_need_merge.push_back(it->first);
new_events_size += it->second->log->events.size();
} }
if (segments_need_merge != segments_merged_) { if (segments_need_merge != segments_merged_) {
qDebug() << "merge segments" << segments_need_merge; qDebug() << "merge segments" << segments_need_merge;
std::vector<Event *> *new_events = new std::vector<Event *>(); new_events_->clear();
new_events->reserve(std::accumulate(segments_need_merge.begin(), segments_need_merge.end(), 0, new_events_->reserve(new_events_size);
[=](int v, int n) { return v + segments_[n]->log->events.size(); }));
for (int n : segments_need_merge) { for (int n : segments_need_merge) {
auto &e = segments_[n]->log->events; const auto &e = segments_[n]->log->events;
auto middle = new_events->insert(new_events->end(), e.begin(), e.end()); auto middle = new_events_->insert(new_events_->end(), e.begin(), e.end());
std::inplace_merge(new_events->begin(), middle, new_events->end(), Event::lessThan()); std::inplace_merge(new_events_->begin(), middle, new_events_->end(), Event::lessThan());
} }
auto prev_events = events_;
updateEvents([&]() { updateEvents([&]() {
events_ = new_events; events_.swap(new_events_);
segments_merged_ = segments_need_merge; segments_merged_ = segments_need_merge;
return true; return true;
}); });
delete prev_events;
} }
} }

@ -69,12 +69,13 @@ protected:
bool events_updated_ = false; bool events_updated_ = false;
uint64_t route_start_ts_ = 0; uint64_t route_start_ts_ = 0;
uint64_t cur_mono_time_ = 0; uint64_t cur_mono_time_ = 0;
std::vector<Event *> *events_ = nullptr; std::unique_ptr<std::vector<Event *>> events_;
std::unique_ptr<std::vector<Event *>> new_events_;
std::vector<int> segments_merged_; std::vector<int> segments_merged_;
// messaging // messaging
SubMaster *sm = nullptr; SubMaster *sm = nullptr;
PubMaster *pm = nullptr; std::unique_ptr<PubMaster> pm;
std::vector<const char*> sockets_; std::vector<const char*> sockets_;
std::unique_ptr<Route> route_; std::unique_ptr<Route> route_;
std::unique_ptr<CameraServer> camera_server_; std::unique_ptr<CameraServer> camera_server_;

Loading…
Cancel
Save