20 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) ) 21 #define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) ) 23 #define DEBMSG ON_DEBUG debug() 24 #define VERMSG ON_VERBOSE verbose() 37 for (
auto& i : lst ) {
38 if ( i.active ) v.
push_back( i.service.get() );
57 for (
auto& svc :
m_listsvc ) svc.service->setServiceManager(
nullptr );
82 auto ip = type.
find(
"__" );
83 if ( ip != std::string::npos ) type.
erase( ip, type.
length() );
85 IService*
service = Service::Factory::create( type, name,
this ).release();
87 fatal() <<
"No Service factory for " << type <<
" available." <<
endmsg;
92 fatal() <<
"Incompatible interface IService version for " << type <<
endmsg;
107 ListSvc::iterator it =
find( svc );
139 error() <<
"Unable to initialize service \"" << typeName.
name() <<
"\"" <<
endmsg;
189 auto it =
find( name );
193 error() <<
"Initialization loop detected when creating service \"" << name <<
"\"" <<
endmsg;
201 if ( name ==
"ApplicationMgr" || name ==
"APPMGR" || name ==
"" ) {
206 if ( createIf &&
addService( typeName ).isSuccess() ) {
207 return find( name )->service;
220 []( ListSvc::const_reference i ) {
return const_cast<IService*
>( i.service.get() ); } );
235 auto it =
find( svc );
245 auto it =
find( name );
257 if ( !p.second ) p.first->second = svctype;
272 for (
auto& it : activeSvc(
m_listsvc ) ) {
274 switch ( it->FSMState() ) {
276 DEBMSG <<
"Service " << name <<
" already initialized" <<
endmsg;
280 sc = it->sysInitialize();
282 error() <<
"Unable to initialize Service: " << name <<
endmsg;
287 error() <<
"Service " << name <<
" not in the correct state to be initialized (" << it->FSMState() <<
")" 306 for (
auto& it : activeSvc(
m_listsvc ) ) {
308 switch ( it->FSMState() ) {
310 DEBMSG <<
"Service " << name <<
" already started" <<
endmsg;
316 error() <<
"Unable to start Service: " << name <<
endmsg;
321 error() <<
"Service " << name <<
" not in the correct state to be started (" << it->FSMState() <<
")" <<
endmsg;
342 switch ( svc->FSMState() ) {
344 DEBMSG <<
"Service " << name <<
" already stopped" <<
endmsg;
350 error() <<
"Unable to stop Service: " << name <<
endmsg;
355 DEBMSG <<
"Service " << name <<
" not in the correct state to be stopped (" << svc->FSMState() <<
")" <<
endmsg;
373 for (
auto& svc : activeSvc(
m_listsvc ) ) {
374 sc = svc->sysReinitialize();
376 error() <<
"Unable to re-initialize Service: " << svc->name() <<
endmsg;
394 for (
auto& svc : activeSvc(
m_listsvc ) ) {
395 sc = svc->sysRestart();
397 error() <<
"Unable to re-start Service: " << svc->name() <<
endmsg;
411 if ( pri_tool != 0 ) {
425 auto p_inc = service<IIncidentSvc>(
"IncidentSvc", false );
427 p_inc->getListeners( postFinList, IncidentType::SvcPostFinalize );
449 if ( !svc->sysFinalize().isSuccess() ) {
450 warning() <<
"Finalization of service " << name <<
" failed" <<
endmsg;
457 if ( !postFinList.
empty() ) {
458 DEBMSG <<
"Will call SvcPostFinalize for " << postFinList.
size() <<
" clients" <<
endmsg;
459 Incident inc(
"ServiceManager", IncidentType::SvcPostFinalize );
460 for (
auto& itr : postFinList ) itr->handle( inc );
465 DEBMSG <<
"Looping over all active services..." <<
endmsg;
468 DEBMSG <<
"---- " << it->service->name() <<
" (refCount = " << it->service->refCount() <<
")" <<
endmsg;
469 if ( it->service->refCount() < 1 ) {
470 warning() <<
"Too low reference count for " << it->service->name() <<
" (should not go below 1 at this point)" 472 it->service->addRef();
487 auto it =
find( name );
495 auto it =
find( name );
518 <<
"===================== listing all services ===================\n" 519 <<
" prior ref name active\n";
524 log.flags( std::ios_base::right );
525 log << svc.priority <<
" ";
527 log << svc.service->refCount() <<
" ";
529 log.flags( std::ios_base::left );
530 log << svc.service->name() <<
" ";
535 log <<
"=================================================================\n";
543 const auto svc =
dynamic_cast<Service*
>( svcItem.service.get() );
The ServiceManager class is in charge of the creation of concrete instances of Services.
std::list< IService * > m_listOfPtrs
List of pointers to the know services used to implement getServices()
constexpr static const auto FAILURE
void setLoopCheckEnabled(bool en) override
Set the value of the initialization loop check flag.
SmartIF< IService > m_appSvc
Pointer to the application IService interface.
boost::lock_guard< Mutex_t > LockGuard_t
T forward_as_tuple(T...args)
StatusCode finalize() override
Finalize (from INITIALIZED to CONFIGURED).
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
MSG::Level resetMessaging()
Reinitialize internal states.
SmartIF< ISvcLocator > m_svcLocator
Service locator (needed to access the MessageSvc)
bool m_loopCheck
Check for service initialization loops.
ServiceManager(IInterface *application)
default creator
Gaudi::StateMachine::State targetFSMState() const override
When we are in the middle of a transition, get the state where the transition is leading us...
boost::recursive_mutex Mutex_t
Mutex to synchronize shared service initialization between threads.
StatusCode restart() override
Initialization (from RUNNING to RUNNING, via INITIALIZED).
bool isValidInterface(I *i)
Templated function that throws an exception if the version if the interface implemented by the object...
MapType m_maptype
Map of service name and service type.
TYPE * get() const
Get interface pointer.
virtual StatusCode sysInitialize()=0
Initialize Service.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
bool existsService(const std::string &name) const override
implementation of ISvcLocation::existsService
StatusCode stop() override
Stop (from RUNNING to INITIALIZED).
Helper class to parse a string of format "type/name".
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
bool loopCheckEnabled() const override
Get the value of the initialization loop check flag.
General service interface definition.
This class is used for returning status codes from appropriate routines.
Definition of the basic interface.
~ServiceManager() override
virtual destructor
#define DECLARE_OBJECT_FACTORY(x)
const std::string & name() const override
Return the name of the manager (implementation of INamedInterface)
iterator find(const key_type &key)
const std::list< IService * > & getServices() const override
Return the list of Services.
StatusCode start() override
Start (from INITIALIZED to RUNNING).
std::pair< iterator, bool > emplace(Args &&...args)
details::reverse_wrapper< T > reverse(T &&iterable)
constexpr static const auto SUCCESS
int getPriority(const std::string &name) const override
manage priorities of services
void outputLevelUpdate() override
Function to call to update the outputLevel of the components (after a change in MessageSvc).
virtual StatusCode sysStart()=0
Start Service.
T back_inserter(T...args)
const std::string & type() const
const StatusCode & ignore() const
Ignore/check StatusCode.
StatusCode reinitialize() override
Initialization (from INITIALIZED or RUNNING to INITIALIZED, via CONFIGURED).
Base class for all Incidents (computing events).
ListSvc::iterator find(const std::string &name)
StatusCode declareSvcType(const std::string &svcname, const std::string &svctype) override
implementation of ISvcManager::declareSvcType
const std::string & name() const
StatusCode setPriority(const std::string &name, int pri) override
StatusCode removeService(IService *svc) override
implementation of ISvcManager::removeService
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
SmartIF< IService > & service(const Gaudi::Utils::TypeNameString &typeName, const bool createIf=true) override
Returns a smart pointer to a service.
std::string typeName(const std::type_info &typ)
ListSvc m_listsvc
List of service maintained by ServiceManager This contains SmartIF<T> for all services – and because...
Base class for all services.
virtual void setServiceManager(ISvcManager *)=0
SmartIF< IService > & createService(const Gaudi::Utils::TypeNameString &nametype) override
implementation of ISvcManager::createService NOTE: as this returns a &, we must guarantee that once c...
SmartIF< IService > service
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
std::map< std::string, Mutex_t > m_lockMap
StatusCode addService(IService *svc, int prio=DEFAULT_SVC_PRIORITY) override
implementation of ISvcManager::addService
StatusCode initialize() override
Initialization (from CONFIGURED to INITIALIZED).