Changes: refactor boosterkiller to monitorbooster

pull/1/head
Alexey Shilov 15 years ago
parent 0195e8b9b3
commit ed132aee32

@ -4,8 +4,8 @@ include(${QT_USE_FILE})
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_HOME_DIRECTORY}/src/common) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_HOME_DIRECTORY}/src/common)
# Set sources # 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(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 boosterkiller.h) set(MOC_HDRS monitorbooster.h)
qt4_wrap_cpp(MOC_SRC ${MOC_HDRS}) qt4_wrap_cpp(MOC_SRC ${MOC_HDRS})
# Find libdl # Find libdl

@ -68,7 +68,7 @@ public:
* *
* \return true on success * \return true on success
*/ */
bool readCommand(); virtual bool readCommand();
/*! /*!
* \brief Initialize and preload stuff * \brief Initialize and preload stuff

@ -22,6 +22,7 @@
#include "mbooster.h" #include "mbooster.h"
#include "qtbooster.h" #include "qtbooster.h"
#include "wrtbooster.h" #include "wrtbooster.h"
#include "monitorbooster.h"
BoosterFactory::BoosterFactory() BoosterFactory::BoosterFactory()
{} {}
@ -40,6 +41,10 @@ Booster * BoosterFactory::create(char type)
{ {
return new WRTBooster(); return new WRTBooster();
} }
else if (type == MonitorBooster::type())
{
return new MonitorBooster();
}
else else
{ {
return NULL; return NULL;
@ -60,6 +65,10 @@ void BoosterFactory::setProcessIdToBooster(char type, pid_t pid)
{ {
WRTBooster::setProcessId(pid); WRTBooster::setProcessId(pid);
} }
else if (type == MonitorBooster::type())
{
MonitorBooster::setProcessId(pid);
}
} }
char BoosterFactory::getBoosterTypeForPid(pid_t pid) char BoosterFactory::getBoosterTypeForPid(pid_t pid)
@ -76,6 +85,10 @@ char BoosterFactory::getBoosterTypeForPid(pid_t pid)
{ {
return WRTBooster::type(); return WRTBooster::type();
} }
else if (pid == MonitorBooster::processId())
{
return MonitorBooster::type();
}
else else
{ {
return 0; return 0;
@ -98,6 +111,7 @@ pid_t BoosterFactory::getBoosterPidForType(char type)
} }
else else
{ {
// not used for MonitorBooster
return 0; return 0;
} }
} }

@ -24,8 +24,8 @@
#include "mbooster.h" #include "mbooster.h"
#include "qtbooster.h" #include "qtbooster.h"
#include "wrtbooster.h" #include "wrtbooster.h"
#include "monitorbooster.h"
#include "boosterfactory.h" #include "boosterfactory.h"
#include "boosterkiller.h"
#include "preload.h" #include "preload.h"
@ -155,8 +155,6 @@ void Daemon::run()
// load and resolve all undefined symbols for each dynamic library from the list // load and resolve all undefined symbols for each dynamic library from the list
preload(); preload();
forkKiller();
// Create sockets for each of the boosters // Create sockets for each of the boosters
Connection::initSocket(MBooster::socketName()); Connection::initSocket(MBooster::socketName());
Connection::initSocket(QtBooster::socketName()); Connection::initSocket(QtBooster::socketName());
@ -166,6 +164,7 @@ void Daemon::run()
forkBooster(MBooster::type()); forkBooster(MBooster::type());
forkBooster(QtBooster::type()); forkBooster(QtBooster::type());
forkBooster(WRTBooster::type()); forkBooster(WRTBooster::type());
forkBooster(MonitorBooster::type());
while (true) 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) void Daemon::forkBooster(char type, int sleepTime)
{ {

@ -21,9 +21,25 @@
#include <QObject> #include <QObject>
#include <cstdlib> #include <cstdlib>
#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); MGConfItem * item = new MGConfItem(key, 0);
m_gConfItems << QSharedPointer<MGConfItem>(item); m_gConfItems << QSharedPointer<MGConfItem>(item);
@ -32,20 +48,54 @@ void BoosterKiller::addKey(const QString & key)
this, SLOT(killProcesses())); this, SLOT(killProcesses()));
} }
void BoosterKiller::addProcessName(const QString & processName) void MonitorBooster::addProcessName(const QString & processName)
{ {
m_processNames << processName; m_processNames << processName;
} }
void BoosterKiller::start() void MonitorBooster::start()
{ {
int argc = 0; int argc = 0;
QCoreApplication(argc, 0).exec(); QCoreApplication(argc, 0).exec();
} }
void BoosterKiller::killProcesses() void MonitorBooster::killProcesses()
{ {
Q_FOREACH(QString processName, m_processNames) { Q_FOREACH(QString processName, m_processNames) {
system( (QString("pkill ") + processName).toStdString().c_str() ); 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;
}

@ -17,27 +17,41 @@
** **
****************************************************************************/ ****************************************************************************/
#ifndef BOOSTERKILLER_H #ifndef MONITORBOOSTER_H
#define BOOSTERKILLER_H #define MONITORBOOSTER_H
#include <QObject> #include <QObject>
#include <QStringList> #include <QStringList>
#include <QSharedPointer> #include <QSharedPointer>
#include <MGConfItem> #include <MGConfItem>
#include "booster.h"
class QString; 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. * Daemon will then restart the boosters.
*/ */
class BoosterKiller : public QObject class MonitorBooster : public QObject, public Booster
{ {
Q_OBJECT Q_OBJECT
public: 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 //! Add a GConf key to trigger booster process termination
void addKey(const QString & key); void addKey(const QString & key);
@ -49,15 +63,49 @@ class BoosterKiller : public QObject
*/ */
void start(); 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 //! Kill all added processes
void killProcesses(); void killProcesses();
private: private:
static const string m_socketId;
static int m_ProcessID;
QStringList m_processNames; QStringList m_processNames;
QList<QSharedPointer<MGConfItem> > m_gConfItems; QList<QSharedPointer<MGConfItem> > m_gConfItems;
}; };
#endif // BOOSTERKILLER_H #endif // MONITORBOOSTER_H
Loading…
Cancel
Save