From ed132aee320858883e2e80399f5d572e1a1090ab Mon Sep 17 00:00:00 2001 From: Alexey Shilov Date: Thu, 16 Sep 2010 15:26:57 +0300 Subject: [PATCH] Changes: refactor boosterkiller to monitorbooster --- src/launcher/CMakeLists.txt | 4 +- src/launcher/booster.h | 2 +- src/launcher/boosterfactory.cpp | 14 +++++ src/launcher/daemon.cpp | 20 +----- .../{boosterkiller.cpp => monitorbooster.cpp} | 60 ++++++++++++++++-- .../{boosterkiller.h => monitorbooster.h} | 62 ++++++++++++++++--- 6 files changed, 129 insertions(+), 33 deletions(-) rename src/launcher/{boosterkiller.cpp => monitorbooster.cpp} (56%) rename src/launcher/{boosterkiller.h => monitorbooster.h} (52%) diff --git a/src/launcher/CMakeLists.txt b/src/launcher/CMakeLists.txt index e541b0b..0179235 100644 --- a/src/launcher/CMakeLists.txt +++ b/src/launcher/CMakeLists.txt @@ -4,8 +4,8 @@ include(${QT_USE_FILE}) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_HOME_DIRECTORY}/src/common) # Set sources -set(SRC appdata.cpp booster.cpp boosterfactory.cpp boosterkiller.cpp connection.cpp daemon.cpp mbooster.cpp logger.cpp main.cpp qtbooster.cpp wrtbooster.cpp) -set(MOC_HDRS boosterkiller.h) +set(SRC appdata.cpp booster.cpp boosterfactory.cpp monitorbooster.cpp connection.cpp daemon.cpp mbooster.cpp logger.cpp main.cpp qtbooster.cpp wrtbooster.cpp) +set(MOC_HDRS monitorbooster.h) qt4_wrap_cpp(MOC_SRC ${MOC_HDRS}) # Find libdl diff --git a/src/launcher/booster.h b/src/launcher/booster.h index 6ef906e..7961d91 100644 --- a/src/launcher/booster.h +++ b/src/launcher/booster.h @@ -68,7 +68,7 @@ public: * * \return true on success */ - bool readCommand(); + virtual bool readCommand(); /*! * \brief Initialize and preload stuff diff --git a/src/launcher/boosterfactory.cpp b/src/launcher/boosterfactory.cpp index 713f45f..7c8efe6 100644 --- a/src/launcher/boosterfactory.cpp +++ b/src/launcher/boosterfactory.cpp @@ -22,6 +22,7 @@ #include "mbooster.h" #include "qtbooster.h" #include "wrtbooster.h" +#include "monitorbooster.h" BoosterFactory::BoosterFactory() {} @@ -40,6 +41,10 @@ Booster * BoosterFactory::create(char type) { return new WRTBooster(); } + else if (type == MonitorBooster::type()) + { + return new MonitorBooster(); + } else { return NULL; @@ -60,6 +65,10 @@ void BoosterFactory::setProcessIdToBooster(char type, pid_t pid) { WRTBooster::setProcessId(pid); } + else if (type == MonitorBooster::type()) + { + MonitorBooster::setProcessId(pid); + } } char BoosterFactory::getBoosterTypeForPid(pid_t pid) @@ -76,6 +85,10 @@ char BoosterFactory::getBoosterTypeForPid(pid_t pid) { return WRTBooster::type(); } + else if (pid == MonitorBooster::processId()) + { + return MonitorBooster::type(); + } else { return 0; @@ -98,6 +111,7 @@ pid_t BoosterFactory::getBoosterPidForType(char type) } else { + // not used for MonitorBooster return 0; } } diff --git a/src/launcher/daemon.cpp b/src/launcher/daemon.cpp index 1945dd1..ed73054 100644 --- a/src/launcher/daemon.cpp +++ b/src/launcher/daemon.cpp @@ -24,8 +24,8 @@ #include "mbooster.h" #include "qtbooster.h" #include "wrtbooster.h" +#include "monitorbooster.h" #include "boosterfactory.h" -#include "boosterkiller.h" #include "preload.h" @@ -155,8 +155,6 @@ void Daemon::run() // load and resolve all undefined symbols for each dynamic library from the list preload(); - forkKiller(); - // Create sockets for each of the boosters Connection::initSocket(MBooster::socketName()); Connection::initSocket(QtBooster::socketName()); @@ -166,6 +164,7 @@ void Daemon::run() forkBooster(MBooster::type()); forkBooster(QtBooster::type()); forkBooster(WRTBooster::type()); + forkBooster(MonitorBooster::type()); while (true) { @@ -209,21 +208,6 @@ void Daemon::run() } } -void Daemon::forkKiller() -{ - pid_t pid = fork(); - if (pid == -1) - Logger::logErrorAndDie(EXIT_FAILURE, "Daemon: Forking killer process failed."); - if (pid == 0) { // child - // If theme or language changes, reset boosters - BoosterKiller bk; - bk.addKey("/meegotouch/theme/name"); - bk.addKey("/meegotouch/i18n/language"); - bk.addProcessName("booster-m"); - bk.addProcessName("booster-w"); - bk.start(); // does not return. - } -} void Daemon::forkBooster(char type, int sleepTime) { diff --git a/src/launcher/boosterkiller.cpp b/src/launcher/monitorbooster.cpp similarity index 56% rename from src/launcher/boosterkiller.cpp rename to src/launcher/monitorbooster.cpp index cf99c7b..ba745ce 100644 --- a/src/launcher/boosterkiller.cpp +++ b/src/launcher/monitorbooster.cpp @@ -21,9 +21,25 @@ #include #include -#include "boosterkiller.h" +#include "monitorbooster.h" -void BoosterKiller::addKey(const QString & key) +const string MonitorBooster::m_socketId = ""; +int MonitorBooster::m_ProcessID = 0; + + +MonitorBooster::MonitorBooster() +{ + addKey("/meegotouch/theme/name"); + addKey("/meegotouch/i18n/language"); + addProcessName("booster-m"); + addProcessName("booster-w"); +} + +MonitorBooster::~MonitorBooster() +{ +} + +void MonitorBooster::addKey(const QString & key) { MGConfItem * item = new MGConfItem(key, 0); m_gConfItems << QSharedPointer(item); @@ -32,20 +48,54 @@ void BoosterKiller::addKey(const QString & key) this, SLOT(killProcesses())); } -void BoosterKiller::addProcessName(const QString & processName) +void MonitorBooster::addProcessName(const QString & processName) { m_processNames << processName; } -void BoosterKiller::start() +void MonitorBooster::start() { int argc = 0; QCoreApplication(argc, 0).exec(); } -void BoosterKiller::killProcesses() +void MonitorBooster::killProcesses() { Q_FOREACH(QString processName, m_processNames) { system( (QString("pkill ") + processName).toStdString().c_str() ); } } + +char MonitorBooster::type() +{ + return 'k'; +} + +bool MonitorBooster::readCommand() +{ + // never return from here + start(); + + return true; +} + +const string & MonitorBooster::socketName() +{ + return m_socketId; +} + +const string & MonitorBooster::socketId() const +{ + return m_socketId; +} + +void MonitorBooster::setProcessId(int pid) +{ + m_ProcessID = pid; +} + +int MonitorBooster::processId() +{ + return m_ProcessID; +} + diff --git a/src/launcher/boosterkiller.h b/src/launcher/monitorbooster.h similarity index 52% rename from src/launcher/boosterkiller.h rename to src/launcher/monitorbooster.h index 7c369aa..251d7fb 100644 --- a/src/launcher/boosterkiller.h +++ b/src/launcher/monitorbooster.h @@ -17,27 +17,41 @@ ** ****************************************************************************/ -#ifndef BOOSTERKILLER_H -#define BOOSTERKILLER_H +#ifndef MONITORBOOSTER_H +#define MONITORBOOSTER_H #include #include #include #include +#include "booster.h" + class QString; -/*! \class BoosterKiller +/*! \class MonitorBooster * - * BoosterKiller kills certain boosters e.g. when themeing or language changes. + * MonitorBooster kills certain boosters e.g. when themeing or language changes. * Daemon will then restart the boosters. */ -class BoosterKiller : public QObject +class MonitorBooster : public QObject, public Booster { Q_OBJECT public: + //! Constructor. + MonitorBooster(); + + //! Destructor. + virtual ~MonitorBooster(); + + /*! + * \brief Return the empty strung (not used in MonitorBooster). + * \return empty string. + */ + static const string & socketName(); + //! Add a GConf key to trigger booster process termination void addKey(const QString & key); @@ -49,15 +63,49 @@ class BoosterKiller : public QObject */ void start(); - private Q_SLOTS: + /*! + * \brief Return a unique character ('k') represtenting the type of MonitorBooster. + * \return Type character. + */ + static char type(); + + /*! + * \brief Override default behaviour, don't wait for commands from invoker. + * \return true on success + */ + virtual bool readCommand(); + + //! \reimp + virtual char boosterType() const { return type(); } + + /*! + * \brief Keep booster pid, should be reset before booster run application's main() function + */ + static void setProcessId(int pid); + + /*! + * \brief Return booster pid + */ + static int processId(); + + +protected: + + //! \reimp + virtual const string & socketId() const; + +private Q_SLOTS: //! Kill all added processes void killProcesses(); private: + static const string m_socketId; + static int m_ProcessID; + QStringList m_processNames; QList > m_gConfItems; }; -#endif // BOOSTERKILLER_H +#endif // MONITORBOOSTER_H