From b1b9a3df473b3a27629be91cab0058b0e140d06d Mon Sep 17 00:00:00 2001 From: kh1 Date: Tue, 11 Nov 2014 14:49:17 +0100 Subject: 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 Reviewed-by: Niels Weber --- src/libs/kdtools/kdrunoncechecker.cpp | 97 +++++++++++++---------------------- src/libs/kdtools/kdrunoncechecker.h | 14 +++-- src/sdk/installerbase.cpp | 4 +- src/sdk/updatechecker.cpp | 2 +- 4 files changed, 48 insertions(+), 69 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 +#include #include #include #include @@ -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 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 allProcesses = runningProcesses(); - const QString appName = qApp->applicationFilePath(); - //QList::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 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 +#include "kdlockfile.h" #include @@ -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 diff --git a/src/sdk/installerbase.cpp b/src/sdk/installerbase.cpp index f262152ae..9d3cd8885 100644 --- a/src/sdk/installerbase.cpp +++ b/src/sdk/installerbase.cpp @@ -72,8 +72,8 @@ InstallerBase::~InstallerBase() int InstallerBase::run() { KDRunOnceChecker runCheck(QLatin1String("lockmyApp1234865.lock")); - if (runCheck.isRunning(KDRunOnceChecker::ProcessList) - || runCheck.isRunning(KDRunOnceChecker::Lockfile)) { + if (runCheck.isRunning(KDRunOnceChecker::ConditionFlag::ProcessList) + || runCheck.isRunning(KDRunOnceChecker::ConditionFlag::Lockfile)) { QInstaller::MessageBoxHandler::information(0, QLatin1String("AlreadyRunning"), QString::fromLatin1("Waiting for %1").arg(qAppName()), QString::fromLatin1("Another %1 instance is already running. Wait " diff --git a/src/sdk/updatechecker.cpp b/src/sdk/updatechecker.cpp index 56316de8b..eec35bacd 100644 --- a/src/sdk/updatechecker.cpp +++ b/src/sdk/updatechecker.cpp @@ -55,7 +55,7 @@ UpdateChecker::UpdateChecker(int &argc, char *argv[]) int UpdateChecker::check() { KDRunOnceChecker runCheck((QLatin1String("lockmyApp15021976.lock"))); - if (runCheck.isRunning(KDRunOnceChecker::Lockfile)) + if (runCheck.isRunning(KDRunOnceChecker::ConditionFlag::Lockfile)) throw QInstaller::Error(QLatin1String("An instance is already checking for updates.")); QString fileName = datFile(binaryFile()); -- cgit v1.2.3