Skip to content

Commit a9c0270

Browse files
committed
refactor: use QDBusServiceWatcher to detect frontend exit
Replace polling-based frontend exit detection with event-driven DBus NameOwnerChanged signal monitoring. Changes: - Use QDBusServiceWatcher to monitor frontend DBus name unregistration - Remove QTimer-based /proc/<pid>/exe polling - Simplify command-line arguments (remove PID, keep DBus name only) Benefits: - Event-driven instead of polling, more efficient - No dependency on Linux-specific /proc filesystem - More reliable detection via DBus daemon guarantees
1 parent 7639e43 commit a9c0270

2 files changed

Lines changed: 15 additions & 24 deletions

File tree

application/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ int main(int argc, char *argv[])
156156
}
157157

158158
QStringList argList;
159-
argList << QString::number(QCoreApplication::applicationPid()) << QDBusConnection::systemBus().baseService();
159+
argList << QDBusConnection::systemBus().baseService();
160160
qDebug() << "Starting deepin-diskmanager-authenticateProxy with args:" << argList;
161161
proc.startDetached("deepin-diskmanager-authenticateProxy", argList);
162162

service/main.cpp

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,12 @@
99
#include <DLog>
1010
#include <QDBusConnection>
1111
#include <QDBusError>
12+
#include <QDBusServiceWatcher>
1213
#include <QThread>
1314

1415
const QString DiskManagerServiceName = "com.deepin.diskmanager";
1516
const QString DiskManagerPath = "/com/deepin/diskmanager";
1617

17-
void checkFrontEndQuit(uint frontEndPid)
18-
{
19-
qDebug() << "checkFrontEndQuit" << frontEndPid;
20-
QString frontEndExe = QString("/proc/%1/exe").arg(frontEndPid);
21-
QFileInfo info(frontEndExe);
22-
23-
if (QFileInfo(info.symLinkTarget()).fileName() != "deepin-diskmanager") {
24-
qWarning() << "Front-end process has quit";
25-
QCoreApplication::exit(0);
26-
}
27-
}
28-
2918
int main(int argc, char *argv[])
3019
{
3120
//set env otherwise utils excutecmd excute command failed
@@ -40,20 +29,17 @@ int main(int argc, char *argv[])
4029
PATH += ":/sbin";
4130
qputenv("PATH", PATH.toLatin1());
4231

43-
uint frontEndPid;
4432
QString frontEndDBusName;
45-
if (argc < 3) {
33+
if (argc < 2) {
4634
qCritical() << "Invalid arguments count:" << argc;
4735
return 1;
4836
} else {
4937
qDebug() << "Arguments count:" << argc;
50-
QString frontEndPidString(argv[1]);
51-
frontEndPid = frontEndPidString.toUInt();
52-
if (frontEndPid == 0) {
53-
qCritical() << "Invalid front-end PID:" << frontEndPid;
38+
frontEndDBusName = QString(argv[1]);
39+
if (frontEndDBusName.isEmpty()) {
40+
qCritical() << "Invalid front-end DBus name";
5441
return 1;
5542
}
56-
frontEndDBusName = QString(argv[2]);
5743
}
5844

5945
QCoreApplication a(argc, argv);
@@ -96,11 +82,16 @@ int main(int argc, char *argv[])
9682
exit(0x0002);
9783
}
9884

99-
QTimer timer;
100-
QObject::connect(&timer, &QTimer::timeout, [frontEndPid] {
101-
checkFrontEndQuit(frontEndPid);
85+
QDBusServiceWatcher *watcher = new QDBusServiceWatcher(
86+
frontEndDBusName,
87+
QDBusConnection::systemBus(),
88+
QDBusServiceWatcher::WatchForUnregistration,
89+
&a
90+
);
91+
QObject::connect(watcher, &QDBusServiceWatcher::serviceUnregistered, [](const QString &name) {
92+
qWarning() << "Front-end service unregistered:" << name;
93+
QCoreApplication::exit(0);
10294
});
103-
timer.start(1000);
10495

10596
return a.exec();
10697
}

0 commit comments

Comments
 (0)