diff --git a/src/kuiserverjobtracker.cpp b/src/kuiserverjobtracker.cpp --- a/src/kuiserverjobtracker.cpp +++ b/src/kuiserverjobtracker.cpp @@ -85,6 +85,8 @@ << d->progressJobView.size() << "stalled jobs"; } + qDeleteAll(d->progressJobView); + delete d; } @@ -119,7 +121,7 @@ } QPointer jobWatch = job; - QDBusReply reply = serverProxy()->uiserver().requestView(appName, + QDBusReply reply = serverProxy()->uiserver()->requestView(appName, programIconName, job->capabilities()); @@ -328,8 +330,8 @@ } KSharedUiServerProxy::KSharedUiServerProxy() - : m_uiserver(QStringLiteral("org.kde.JobViewServer"), QStringLiteral("/JobViewServer"), QDBusConnection::sessionBus()) - , m_watcher(QStringLiteral("org.kde.JobViewServer"), QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange) + : m_uiserver(new org::kde::JobViewServer(QStringLiteral("org.kde.JobViewServer"), QStringLiteral("/JobViewServer"), QDBusConnection::sessionBus())) + , m_watcher(new QDBusServiceWatcher(QStringLiteral("org.kde.JobViewServer"), QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange)) { QDBusConnectionInterface *bus = QDBusConnection::sessionBus().interface(); if (!bus->isServiceRegistered(QStringLiteral("org.kde.JobViewServer"))) { @@ -349,17 +351,24 @@ qCDebug(KJOBWIDGETS) << "kuiserver found"; } - connect(&m_watcher, &QDBusServiceWatcher::serviceOwnerChanged, this, &KSharedUiServerProxy::uiserverOwnerChanged); + connect(m_watcher.get(), &QDBusServiceWatcher::serviceOwnerChanged, this, &KSharedUiServerProxy::uiserverOwnerChanged); + + // cleanup early enough to avoid issues with dbus at application exit + // see e.g. https://phabricator.kde.org/D2545 + qAddPostRoutine([]() { + serverProxy->m_uiserver.reset(); + serverProxy->m_watcher.reset(); + }); } KSharedUiServerProxy::~KSharedUiServerProxy() { } -org::kde::JobViewServer &KSharedUiServerProxy::uiserver() +org::kde::JobViewServer *KSharedUiServerProxy::uiserver() { - return m_uiserver; + return m_uiserver.get(); } void KSharedUiServerProxy::uiserverOwnerChanged(const QString &serviceName, const QString &oldOwner, const QString &newOwner) diff --git a/src/kuiserverjobtracker_p.h b/src/kuiserverjobtracker_p.h --- a/src/kuiserverjobtracker_p.h +++ b/src/kuiserverjobtracker_p.h @@ -24,6 +24,8 @@ #ifndef KUISERVERJOBTRACKER_P_H #define KUISERVERJOBTRACKER_P_H +#include + #include #include "jobviewserverinterface.h" @@ -36,17 +38,17 @@ KSharedUiServerProxy(); ~KSharedUiServerProxy(); - org::kde::JobViewServer &uiserver(); + org::kde::JobViewServer *uiserver(); Q_SIGNALS: void serverRegistered(); void serverUnregistered(); private: void uiserverOwnerChanged(const QString &serviceName, const QString &oldOwner, const QString &newOwner); - org::kde::JobViewServer m_uiserver; - QDBusServiceWatcher m_watcher; + std::unique_ptr m_uiserver; + std::unique_ptr m_watcher; }; #endif