diff --git a/selfdrive/ui/replay/replay.cc b/selfdrive/ui/replay/replay.cc index e3753ccf20..8155eb3456 100644 --- a/selfdrive/ui/replay/replay.cc +++ b/selfdrive/ui/replay/replay.cc @@ -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(s); } route_ = std::make_unique(route, data_dir); - events_ = new std::vector(); + events_ = std::make_unique>(); + new_events_ = std::make_unique>(); 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 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 *new_events = new std::vector(); - 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; } } diff --git a/selfdrive/ui/replay/replay.h b/selfdrive/ui/replay/replay.h index 2d30d90e4b..a3e6efaadb 100644 --- a/selfdrive/ui/replay/replay.h +++ b/selfdrive/ui/replay/replay.h @@ -69,12 +69,13 @@ protected: bool events_updated_ = false; uint64_t route_start_ts_ = 0; uint64_t cur_mono_time_ = 0; - std::vector *events_ = nullptr; + std::unique_ptr> events_; + std::unique_ptr> new_events_; std::vector segments_merged_; // messaging SubMaster *sm = nullptr; - PubMaster *pm = nullptr; + std::unique_ptr pm; std::vector sockets_; std::unique_ptr route_; std::unique_ptr camera_server_;