From 7ac2f876acb557a7a36ae780bccdd97554b0cd17 Mon Sep 17 00:00:00 2001 From: Slava Monich Date: Tue, 30 Sep 2014 13:57:53 +0300 Subject: [PATCH] [transfer-engine] Prevent premature exits If TransferEnginePrivate::exitSafely() finds out that activity is still ongoing it should cancel previously sheduled delayedExitSafely() call. Otherwise delayedExitSafely() may be invoked between two syncs causing nemo-transfer-engine to exit and get immediately restarted by D-Bus which isn't something we really want. We want to exit when all the activity has really calmed down. --- src/transferengine.cpp | 19 +++++++++++-------- src/transferengine_p.h | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/transferengine.cpp b/src/transferengine.cpp index 7339115..bd04fb7 100644 --- a/src/transferengine.cpp +++ b/src/transferengine.cpp @@ -147,6 +147,11 @@ TransferEnginePrivate::TransferEnginePrivate(TransferEngine *parent): m_fileWatcherTimer->setSingleShot(true); connect(m_fileWatcherTimer, SIGNAL(timeout()), this, SLOT(enabledPluginsCheck())); + m_delayedExitTimer = new QTimer(this); + m_delayedExitTimer->setSingleShot(true); + m_delayedExitTimer->setInterval(5000); + connect(m_delayedExitTimer, SIGNAL(timeout()), this, SLOT(delayedExitSafely())); + m_fileWatcher = new QFileSystemWatcher(this); m_fileWatcher->addPath(SHARE_PLUGINS_PATH); connect(m_fileWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(pluginDirChanged())); @@ -177,19 +182,17 @@ void TransferEnginePrivate::pluginDirChanged() void TransferEnginePrivate::exitSafely() { if (!m_activityMonitor->activeTransfers()) { - qDebug() << Q_FUNC_INFO; - QTimer::singleShot(2000, this, SLOT(delayedExitSafely())); + qDebug() << "Scheduling exit in" << m_delayedExitTimer->interval() << "ms"; + m_delayedExitTimer->start(); + } else { + m_delayedExitTimer->stop(); } } void TransferEnginePrivate::delayedExitSafely() { - if (m_activityMonitor->activeTransfers()) { - qDebug() << "Keeping transfer engine alive, transfers still ongoing"; - } else { - qDebug() << "Stopping transfer engine"; - qApp->exit(); - } + qDebug() << "Stopping transfer engine"; + qApp->exit(); } void TransferEnginePrivate::enabledPluginsCheck() diff --git a/src/transferengine_p.h b/src/transferengine_p.h index 61c3815..779d32c 100644 --- a/src/transferengine_p.h +++ b/src/transferengine_p.h @@ -83,8 +83,6 @@ public Q_SLOTS: QTimer *m_timer; }; - - class TransferEnginePrivate: QObject { Q_OBJECT @@ -133,6 +131,7 @@ public Q_SLOTS: MediaTransferInterface *loadPlugin(const QString &pluginId) const; QString mediaFileOrResourceName(MediaItem *mediaItem) const; +private: QMap m_plugins; QMap m_keyTypeCache; bool m_notificationsEnabled; @@ -141,6 +140,7 @@ public Q_SLOTS: Accounts::Manager *m_accountManager; QFileSystemWatcher *m_fileWatcher; QTimer *m_fileWatcherTimer; + QTimer *m_delayedExitTimer; QSettings m_settings; ClientActivityMonitor *m_activityMonitor; TransferEngine *q_ptr;