summaryrefslogtreecommitdiffstats
path: root/src/libs/kdtools
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@digia.com>2014-11-11 14:49:17 +0100
committerKarsten Heimrich <karsten.heimrich@theqtcompany.com>2014-11-12 21:22:35 +0100
commitb1b9a3df473b3a27629be91cab0058b0e140d06d (patch)
tree3308a35c1e5148de3d29f073f515afd375c828c3 /src/libs/kdtools
parentca0369791c672b72cf47974ba3e3a4e0b81cce28 (diff)
Rewrite the isRunning implementation and remove private class.
Use a more descriptive enum name. On Windows keep the lower case version of the process name instead of calling toLower() several times. Print a warning if we cannot obtain or release the lock. Change-Id: Iaaefae0359cd214290f62ce78677cb343da8823c Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com> Reviewed-by: Niels Weber <niels.weber@digia.com>
Diffstat (limited to 'src/libs/kdtools')
-rw-r--r--src/libs/kdtools/kdrunoncechecker.cpp97
-rw-r--r--src/libs/kdtools/kdrunoncechecker.h14
2 files changed, 45 insertions, 66 deletions
diff --git a/src/libs/kdtools/kdrunoncechecker.cpp b/src/libs/kdtools/kdrunoncechecker.cpp
index 7be12d425..8e4c42711 100644
--- a/src/libs/kdtools/kdrunoncechecker.cpp
+++ b/src/libs/kdtools/kdrunoncechecker.cpp
@@ -38,6 +38,7 @@
#include "kdsysinfo.h"
#include <QCoreApplication>
+#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QList>
@@ -46,90 +47,64 @@
using namespace KDUpdater;
-class KDRunOnceChecker::Private
-{
-public:
- Private(const QString &filename);
-
- KDLockFile m_lockfile;
- bool m_hasLock;
-};
-
-KDRunOnceChecker::Private::Private(const QString &filename)
- : m_lockfile(filename)
- , m_hasLock(false)
-{}
-
KDRunOnceChecker::KDRunOnceChecker(const QString &filename)
- :d(new Private(filename))
-{}
+ : m_lockfile(filename)
+{
+}
KDRunOnceChecker::~KDRunOnceChecker()
{
- delete d;
+ if (!m_lockfile.unlock())
+ qWarning() << m_lockfile.errorString().toUtf8().constData();
}
class ProcessnameEquals
{
public:
- ProcessnameEquals(const QString &name): m_name(name) {}
+ ProcessnameEquals(const QString &name)
+#ifdef Q_OS_WIN
+ : m_name(name.toLower())
+#else
+ : m_name(name)
+#endif
+ {}
bool operator()(const ProcessInfo &info)
{
-#ifndef Q_OS_WIN
- if (info.name == m_name)
- return true;
- const QFileInfo fi(info.name);
- if (fi.fileName() == m_name || fi.baseName() == m_name)
+#ifdef Q_OS_WIN
+ const QString infoName = info.name.toLower();
+ if (infoName == QDir::toNativeSeparators(m_name))
return true;
- return false;
#else
- if (info.name.toLower() == m_name.toLower())
- return true;
- if (info.name.toLower() == QDir::toNativeSeparators(m_name.toLower()))
+ const QString infoName = info.name;
+#endif
+ if (infoName == m_name)
return true;
- const QFileInfo fi(info.name);
- if (fi.fileName().toLower() == m_name.toLower() || fi.baseName().toLower() == m_name.toLower())
+
+ const QFileInfo fi(infoName);
+ if (fi.fileName() == m_name || fi.baseName() == m_name)
return true;
- return info.name == m_name;
-#endif
+ return false;
}
private:
QString m_name;
};
-bool KDRunOnceChecker::isRunning(Dependencies depends)
+bool KDRunOnceChecker::isRunning(KDRunOnceChecker::ConditionFlags flags)
{
- bool running = false;
- switch (depends) {
- case Lockfile: {
- const bool locked = d->m_hasLock || d->m_lockfile.lock();
- if (locked)
- d->m_hasLock = true;
- running = running || ! locked;
- }
- break;
- case ProcessList: {
- const QList<ProcessInfo> allProcesses = runningProcesses();
- const QString appName = qApp->applicationFilePath();
- //QList< ProcessInfo >::const_iterator it = std::find_if(allProcesses.constBegin(), allProcesses.constEnd(), ProcessnameEquals(appName));
- const int count = std::count_if(allProcesses.constBegin(), allProcesses.constEnd(), ProcessnameEquals(appName));
- running = running || /*it != allProcesses.constEnd()*/count > 1;
- }
- break;
- case Both: {
- const QList<ProcessInfo> allProcesses = runningProcesses();
- const QString appName = qApp->applicationFilePath();
- //QList<ProcessInfo>::const_iterator it = std::find_if(allProcesses.constBegin(), allProcesses.constEnd(), ProcessnameEquals(appName));
- const int count = std::count_if(allProcesses.constBegin(), allProcesses.constEnd(), ProcessnameEquals(appName));
- const bool locked = d->m_hasLock || d->m_lockfile.lock();
- if (locked)
- d->m_hasLock = true;
- running = running || ( /*it != allProcesses.constEnd()*/count > 1 && !locked);
- }
- break;
+ if (flags.testFlag(ConditionFlag::ProcessList)) {
+ const QList<ProcessInfo> allProcesses = runningProcesses();
+ const int count = std::count_if(allProcesses.constBegin(), allProcesses.constEnd(),
+ ProcessnameEquals(QCoreApplication::applicationFilePath()));
+ return (count > 1);
}
- return running;
+ if (flags.testFlag(ConditionFlag::Lockfile)) {
+ const bool locked = m_lockfile.lock();
+ if (!locked)
+ qWarning() << m_lockfile.errorString().toUtf8().constData();
+ return !locked;
+ }
+ return false;
}
diff --git a/src/libs/kdtools/kdrunoncechecker.h b/src/libs/kdtools/kdrunoncechecker.h
index 5c43e596e..92051ee9f 100644
--- a/src/libs/kdtools/kdrunoncechecker.h
+++ b/src/libs/kdtools/kdrunoncechecker.h
@@ -36,7 +36,7 @@
#ifndef KDTOOLS_RUNONCECHECKER_H
#define KDTOOLS_RUNONCECHECKER_H
-#include <kdtoolsglobal.h>
+#include "kdlockfile.h"
#include <QString>
@@ -45,15 +45,19 @@ class KDTOOLS_EXPORT KDRunOnceChecker
Q_DISABLE_COPY(KDRunOnceChecker)
public:
- enum Dependencies { ProcessList, Lockfile, Both };
+ enum struct ConditionFlag {
+ Lockfile = 0x01,
+ ProcessList = 0x02
+ };
+ Q_DECLARE_FLAGS(ConditionFlags, ConditionFlag)
explicit KDRunOnceChecker(const QString &filename = QString());
~KDRunOnceChecker();
- bool isRunning(Dependencies depends);
+
+ bool isRunning(KDRunOnceChecker::ConditionFlags flags);
private:
- class Private;
- Private *d;
+ KDLockFile m_lockfile;
};
#endif // KDTOOLS_RUNONCECHECKER_H