[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdebase/runtime/nepomuk/server
From: Sebastian Trueg <sebastian () trueg ! de>
Date: 2011-01-17 16:20:46
Message-ID: 20110117162046.47E8BAC8B5 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1215095 by trueg:
If a service goes down, also shutdown all services depending on it and schedule them for restart.
M +3 -0 servicecontroller.cpp
M +7 -1 servicecontroller.h
M +33 -8 servicemanager.cpp
M +1 -0 servicemanager.h
--- trunk/KDE/kdebase/runtime/nepomuk/server/servicecontroller.cpp #1215094:1215095
@@ -305,6 +305,9 @@
// on its restart-on-crash feature and have to do it manually. Afterwards it is back
// to normal
if( serviceName == dbusServiceName( name() ) ) {
+
+ emit serviceStopped( this );
+
if( d->attached && d->started ) {
kDebug() << "Attached service" << name() << "went down. Restarting ourselves.";
start();
--- trunk/KDE/kdebase/runtime/nepomuk/server/servicecontroller.h #1215094:1215095
@@ -78,15 +78,21 @@
*/
void serviceInitialized( ServiceController* );
+ /**
+ * Emitted once the service has stopped, i.e.
+ * once its DBus service is gone.
+ */
+ void serviceStopped( ServiceController* );
+
private Q_SLOTS:
void slotProcessFinished( bool );
void slotServiceRegistered( const QString& serviceName );
void slotServiceUnregistered( const QString& serviceName );
void slotServiceInitialized( bool success );
- private:
void createServiceControlInterface();
+ private:
class Private;
Private* const d;
};
--- trunk/KDE/kdebase/runtime/nepomuk/server/servicemanager.cpp #1215094:1215095
@@ -170,6 +170,12 @@
*/
void _k_serviceInitialized( ServiceController* );
+ /**
+ * Slot connected to all ServiceController::serviceStopped
+ * signals.
+ */
+ void _k_serviceStopped( ServiceController* );
+
private:
bool m_initialized;
ServiceManager* q;
@@ -198,6 +204,8 @@
ServiceController* sc = new ServiceController( service, q );
connect( sc, SIGNAL(serviceInitialized(ServiceController*)),
q, SLOT(_k_serviceInitialized(ServiceController*)) );
+ connect( sc, SIGNAL(serviceStopped(ServiceController*)),
+ q, SLOT(_k_serviceStopped(ServiceController*)) );
services.insert( sc->name(), sc );
}
}
@@ -226,7 +234,7 @@
bool needToQueue = false;
foreach( const QString &dependency, dependencyTree[sc->name()] ) {
ServiceController* depSc = findService( dependency );
- if ( !depSc->isInitialized() ) {
+ if ( !needToQueue && !depSc->isInitialized() ) {
kDebug() << "Queueing" << sc->name() << "due to dependency" << dependency;
pendingServices.insert( sc );
needToQueue = true;
@@ -247,16 +255,13 @@
bool Nepomuk::ServiceManager::Private::stopService( ServiceController* sc )
{
- // make sure the service is not scheduled to be started later anymore
- pendingServices.remove( sc );
-
- // stop it if already running
- if( sc->isRunning() ) {
// shut down any service depending of this one first
foreach( const QString &dep, dependencyTree.servicesDependingOn( sc->name() ) ) {
stopService( services[dep] );
}
+ // stop it if already running
+ if( sc->isRunning() ) {
sc->stop();
return true;
}
@@ -268,6 +273,8 @@
void Nepomuk::ServiceManager::Private::startPendingServices( ServiceController* newService )
{
+ kDebug() << newService->name() << pendingServices;
+
// check the list of pending services and start as many as possible
// (we can start services whose dependencies are initialized)
QList<ServiceController*> sl = pendingServices.toList();
@@ -284,14 +291,29 @@
void Nepomuk::ServiceManager::Private::_k_serviceInitialized( ServiceController* sc )
{
kDebug() << "Service initialized:" << sc->name();
- if ( !pendingServices.isEmpty() ) {
+
startPendingServices( sc );
- }
emit q->serviceInitialized( sc->name() );
}
+void Nepomuk::ServiceManager::Private::_k_serviceStopped( ServiceController* sc )
+{
+ kDebug() << "Service stopped:" << sc->name();
+ // stop and queue all services depending on the stopped one
+ // this will re-trigger this method until all reverse-deps are stopped
+ foreach( const QString &dep, dependencyTree.servicesDependingOn( sc->name() ) ) {
+ ServiceController* depsc = services[dep];
+ if( depsc->isRunning() ) {
+ kDebug() << "Stopping and queuing rev-dep" << depsc->name();
+ depsc->stop();
+ pendingServices.insert( depsc );
+ }
+ }
+}
+
+
Nepomuk::ServiceManager::ServiceManager( QObject* parent )
: QObject(parent),
d(new Private(this))
@@ -350,6 +372,9 @@
bool Nepomuk::ServiceManager::stopService( const QString& name )
{
if( ServiceController* sc = d->findService( name ) ) {
+ // make sure the service is not scheduled to be started later anymore
+ d->pendingServices.remove( sc );
+
return d->stopService( sc );
}
return false;
--- trunk/KDE/kdebase/runtime/nepomuk/server/servicemanager.h #1215094:1215095
@@ -124,6 +124,7 @@
Private* const d;
Q_PRIVATE_SLOT( d, void _k_serviceInitialized(ServiceController*) )
+ Q_PRIVATE_SLOT( d, void _k_serviceStopped(ServiceController*) )
};
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic