diff --git a/src/gamecenter/gamecenterdaemon.cpp b/src/gamecenter/gamecenterdaemon.cpp index 162fd76..a5cfa03 100644 --- a/src/gamecenter/gamecenterdaemon.cpp +++ b/src/gamecenter/gamecenterdaemon.cpp @@ -3,6 +3,7 @@ #include "gamecenterdaemon.h" +#include #include #include #include @@ -878,6 +879,47 @@ GameCenterDaemon::GameCenterDaemon(QObject *parent) { } +GameCenterDaemon::~GameCenterDaemon() +{ + prepareForShutdown(); +} + +void GameCenterDaemon::prepareForShutdown() +{ + for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { + if (it.value().scanner) { + it.value().scanner->cancel(); + } + + QPointer proc = it.value().process; + it.value().process = nullptr; + if (proc) { + proc->disconnect(this); + if (proc->state() != QProcess::NotRunning) { + proc->setParent(nullptr); + } else { + proc->deleteLater(); + } + } + + if (it.value().scanner) { + it.value().scanner->disconnect(this); + it.value().scanner->deleteLater(); + it.value().scanner = nullptr; + } + } + + for (auto it = m_unitPathWatchers.begin(); it != m_unitPathWatchers.end(); ++it) { + if (QObject *watcher = it.value()) { + watcher->deleteLater(); + } + } + + m_unitPathWatchers.clear(); + m_unitPathToSessionId.clear(); + m_unitNameToSessionId.clear(); +} + bool GameCenterDaemon::init() { QDBusConnection bus = QDBusConnection::sessionBus(); @@ -897,6 +939,10 @@ bool GameCenterDaemon::init() recoverExistingSessions(); + if (QCoreApplication::instance()) { + connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &GameCenterDaemon::prepareForShutdown); + } + return true; } diff --git a/src/gamecenter/gamecenterdaemon.h b/src/gamecenter/gamecenterdaemon.h index 0dd493f..0bed398 100644 --- a/src/gamecenter/gamecenterdaemon.h +++ b/src/gamecenter/gamecenterdaemon.h @@ -23,6 +23,7 @@ class GameCenterDaemon : public QObject public: explicit GameCenterDaemon(QObject *parent = nullptr); + ~GameCenterDaemon() override; bool init(); @@ -76,6 +77,8 @@ private: void handleSystemdUnitPropertiesChanged(const QDBusObjectPath &unitPath, const QVariantMap &changedProperties); void removeSessionInternal(const QString &sessionId, const QString &finalState); + void prepareForShutdown(); + private Q_SLOTS: void handleSystemdUnitNew(const QString &unitName, const QDBusObjectPath &unitPath); void handleSystemdUnitRemoved(const QString &unitName, const QDBusObjectPath &unitPath);