summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/packagemanagercore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/installer/packagemanagercore.cpp')
-rw-r--r--src/libs/installer/packagemanagercore.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index 09cfcac9f..81537814c 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -49,6 +49,10 @@
#include "settings.h"
#include "utils.h"
+#include <QFuture>
+#include <QFutureWatcher>
+#include <QtConcurrentRun>
+
#include <QtCore/QMutex>
#include <QtCore/QSettings>
#include <QtCore/QTemporaryFile>
@@ -1103,6 +1107,42 @@ bool PackageManagerCore::isProcessRunning(const QString &name) const
return PackageManagerCorePrivate::isProcessRunning(name, runningProcesses());
}
+/*!
+ Return true, if a process with \a absoluteFilePath could be killed or isn't running
+ Note: this is implemented in a semi blocking way (to keep the main thread to paint the UI)
+*/
+bool PackageManagerCore::killProcess(const QString &absoluteFilePath) const
+{
+ QString normalizedPath = replaceVariables(absoluteFilePath);
+ normalizedPath = QDir::cleanPath(normalizedPath.replace(QLatin1Char('\\'), QLatin1Char('/')));
+
+ QList<ProcessInfo> allProcesses = runningProcesses();
+ foreach (const ProcessInfo &process, allProcesses) {
+ QString processPath = process.name;
+ processPath = QDir::cleanPath(processPath.replace(QLatin1Char('\\'), QLatin1Char('/')));
+
+ if (processPath == normalizedPath) {
+ qDebug() << QString::fromLatin1("try to kill process: %1(%2)").arg(process.name).arg(process.id);
+
+ //to keep the ui responsible use QtConcurrent::run
+ QFutureWatcher<bool> futureWatcher;
+ const QFuture<bool> future = QtConcurrent::run(KDUpdater::killProcess, process, 30000);
+
+ QEventLoop loop;
+ loop.connect(&futureWatcher, SIGNAL(finished()), SLOT(quit()), Qt::QueuedConnection);
+ futureWatcher.setFuture(future);
+
+ if (!future.isFinished())
+ loop.exec();
+
+ qDebug() << QString::fromLatin1("\"%1\" killed!").arg(process.name);
+ return future.result();
+ }
+ }
+ return true;
+}
+
+
void PackageManagerCore::setDependsOnLocalInstallerBinary()
{
d->m_dependsOnLocalInstallerBinary = true;