Skip to content

Commit 2253cba

Browse files
authored
c++ replay: graceful shutdown (#22280)
* graceful shutdown * reset termios * continue * call clear in dctor * unpause * delete vipc_server * relase context * notify_one * merge master * merge master * print vipc stop listen before shutdown down
1 parent 29b9c8f commit 2253cba

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

selfdrive/ui/replay/main.cc

+15-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "selfdrive/ui/replay/replay.h"
22

3+
#include <csignal>
34
#include <iostream>
45
#include <termios.h>
56

@@ -10,9 +11,16 @@
1011

1112
const QString DEMO_ROUTE = "4cf7a6ad03080c90|2021-09-29--13-46-36";
1213

14+
struct termios oldt = {};
15+
16+
void sigHandler(int s) {
17+
std::signal(s, SIG_DFL);
18+
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
19+
qApp->quit();
20+
}
21+
1322
int getch() {
1423
int ch;
15-
struct termios oldt;
1624
struct termios newt;
1725

1826
tcgetattr(STDIN_FILENO, &oldt);
@@ -63,7 +71,9 @@ void keyboardThread(Replay *replay) {
6371
}
6472

6573
int main(int argc, char *argv[]){
66-
QApplication a(argc, argv);
74+
QApplication app(argc, argv);
75+
std::signal(SIGINT, sigHandler);
76+
std::signal(SIGTERM, sigHandler);
6777

6878
QCommandLineParser parser;
6979
parser.setApplicationDescription("Mock openpilot components by publishing logged messages.");
@@ -76,7 +86,7 @@ int main(int argc, char *argv[]){
7686
parser.addOption({"dcam", "load driver camera"});
7787
parser.addOption({"ecam", "load wide road camera"});
7888

79-
parser.process(a);
89+
parser.process(app);
8090
const QStringList args = parser.positionalArguments();
8191
if (args.empty() && !parser.isSet("demo")) {
8292
parser.showHelp();
@@ -86,7 +96,7 @@ int main(int argc, char *argv[]){
8696
QStringList allow = parser.value("allow").isEmpty() ? QStringList{} : parser.value("allow").split(",");
8797
QStringList block = parser.value("block").isEmpty() ? QStringList{} : parser.value("block").split(",");
8898

89-
Replay *replay = new Replay(route, allow, block, nullptr, parser.isSet("dcam"), parser.isSet("ecam"));
99+
Replay *replay = new Replay(route, allow, block, nullptr, parser.isSet("dcam"), parser.isSet("ecam"), &app);
90100
if (replay->load()) {
91101
replay->start(parser.value("start").toInt());
92102
}
@@ -96,5 +106,5 @@ int main(int argc, char *argv[]){
96106
QObject::connect(t, &QThread::finished, t, &QThread::deleteLater);
97107
t->start();
98108

99-
return a.exec();
109+
return app.exec();
100110
}

selfdrive/ui/replay/replay.cc

+18-4
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,21 @@ Replay::Replay(QString route, QStringList allow, QStringList block, SubMaster *s
3535
}
3636

3737
Replay::~Replay() {
38-
// TODO: quit stream thread and free resources.
38+
qDebug() << "shutdown: in progress...";
39+
40+
exit_ = true;
41+
updating_events_ = true;
42+
if (stream_thread_) {
43+
stream_cv_.notify_one();
44+
stream_thread_->quit();
45+
stream_thread_->wait();
46+
}
47+
48+
delete pm;
49+
delete events_;
50+
segments_.clear();
51+
camera_server_.reset(nullptr);
52+
qDebug() << "shutdown: done";
3953
}
4054

4155
bool Replay::load() {
@@ -54,9 +68,9 @@ void Replay::start(int seconds) {
5468

5569
camera_server_ = std::make_unique<CameraServer>();
5670
// start stream thread
57-
thread = new QThread;
58-
QObject::connect(thread, &QThread::started, [=]() { stream(); });
59-
thread->start();
71+
stream_thread_ = new QThread(this);
72+
QObject::connect(stream_thread_, &QThread::started, [=]() { stream(); });
73+
stream_thread_->start();
6074
}
6175

6276
void Replay::updateEvents(const std::function<bool()> &lambda) {

selfdrive/ui/replay/replay.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ protected slots:
3636
void updateEvents(const std::function<bool()>& lambda);
3737
void publishFrame(const Event *e);
3838

39-
QThread *thread;
39+
QThread *stream_thread_ = nullptr;
4040

4141
// logs
4242
std::mutex stream_lock_;
@@ -54,8 +54,8 @@ protected slots:
5454
std::vector<int> segments_merged_;
5555

5656
// messaging
57-
SubMaster *sm;
58-
PubMaster *pm;
57+
SubMaster *sm = nullptr;
58+
PubMaster *pm = nullptr;
5959
std::vector<const char*> sockets_;
6060
std::unique_ptr<Route> route_;
6161
bool load_dcam = false, load_ecam = false;

0 commit comments

Comments
 (0)