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

* reuse events buffer

* Trigger Build
pull/23206/head
Dean Lee 2021-12-13 22:22:31 +08:00 committed by GitHub
parent 5c6229f3df
commit 8a84263c2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 15 deletions

View File

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

View File

@ -69,12 +69,13 @@ protected:
bool events_updated_ = false;
uint64_t route_start_ts_ = 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_;
// messaging
SubMaster *sm = nullptr;
PubMaster *pm = nullptr;
std::unique_ptr<PubMaster> pm;
std::vector<const char*> sockets_;
std::unique_ptr<Route> route_;
std::unique_ptr<CameraServer> camera_server_;