The Gaudi Framework  master (37c0b60a)
Service.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 // Include Files
13 #include <GaudiKernel/Guards.h>
19 #include <GaudiKernel/MsgStream.h>
21 #include <GaudiKernel/Service.h>
23 
24 using std::string;
25 
26 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) )
27 #define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) )
28 
30  if ( m_svcManager ) m_svcManager->removeService( this ).ignore();
31 }
32 
33 // IService::sysInitialize
36  return m_initSC;
37 }
38 
40 
41  try {
43  Gaudi::Guards::AuditorGuard guard( this,
44  // check if we want to audit the initialize
46 
47  // initialize messaging (except for MessageSvc)
48  if ( name() != "MessageSvc" ) {
49  // this initializes the messaging, in case property update handlers need to print
50  // and update the property value bypassing the update handler
52  }
53 
54  bindPropertiesTo( serviceLocator()->getOptsSvc() );
55 
57  error() << "Property AutoRetrieveTools must be set TRUE if CheckToolDeps is True" << endmsg;
59  return;
60  }
61 
62  m_initSC = initialize(); // This should change the state to Gaudi::StateMachine::CONFIGURED
63 
64  // Check for data dependencies in AlgTools
65  // visit all sub-algs and tools, build full set. First initialize ToolHandles if needed
66  if ( m_autoRetrieveTools ) {
67  try {
69  } catch ( const GaudiException& Exception ) {
70  error() << "Service failed to initilize ToolHandles : " << Exception << endmsg;
72  return;
73  }
74 
75  if ( m_checkToolDeps ) {
76  for ( auto& itool : m_tools ) {
77  info() << " AlgTool: " << itool->name() << endmsg;
78  IDataHandleHolder* idh = dynamic_cast<IDataHandleHolder*>( itool );
79  if ( idh == 0 ) {
80  error() << "dcast to IDataHandleHolder failed" << endmsg;
81  continue;
82  }
83  if ( idh->inputDataObjs().size() != 0 ) {
84  error() << "Service " << name() << " holds AlgTool " << itool->name()
85  << " which holds at least one ReadDataHandle" << endmsg;
86  for ( auto& obj : idh->inputDataObjs() ) { error() << " -> InputHandle: " << obj << endmsg; }
88  }
89  if ( idh->outputDataObjs().size() != 0 ) {
90  error() << "Service " << name() << " holds AlgTool " << itool->name()
91  << " which holds at least one WriteDataHandle" << endmsg;
92  for ( auto& obj : idh->outputDataObjs() ) { error() << " -> OutputHandle: " << obj << endmsg; }
94  }
95  }
96  }
97  }
98 
100  return;
101  } catch ( const GaudiException& Exception ) {
102  fatal() << "in sysInitialize(): exception with tag=" << Exception.tag() << " is caught" << endmsg;
103  error() << Exception << endmsg;
104  // Stat stat( chronoSvc() , Exception.tag() );
105  } catch ( const std::exception& Exception ) {
106  fatal() << "in sysInitialize(): standard std::exception is caught" << endmsg;
107  error() << Exception.what() << endmsg;
108  // Stat stat( chronoSvc() , "*std::exception*" );
109  } catch ( ... ) {
110  fatal() << "in sysInitialize(): UNKNOWN Exception is caught" << endmsg;
111  // Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
112  }
113 
115 }
116 
117 //--- IService::initialize
119  ON_DEBUG debug() << "Service base class initialized successfully" << endmsg;
121  return StatusCode::SUCCESS;
122 }
123 
124 // IService::sysStart
126  StatusCode sc;
127 
128  try {
130  Gaudi::Guards::AuditorGuard guard( this,
131  // check if we want to audit the initialize
132  ( m_auditorStart ) ? auditorSvc().get() : nullptr, IAuditor::Start );
133  sc = start();
134  if ( sc.isSuccess() ) m_state = m_targetState;
135  return sc;
136  } catch ( const GaudiException& Exception ) {
137  fatal() << "in sysStart(): exception with tag=" << Exception.tag() << " is caught" << endmsg;
138  error() << Exception << endmsg;
139  // Stat stat( chronoSvc() , Exception.tag() );
140  } catch ( const std::exception& Exception ) {
141  fatal() << "in sysStart(): standard std::exception is caught" << endmsg;
142  fatal() << Exception.what() << endmsg;
143  // Stat stat( chronoSvc() , "*std::exception*" );
144  } catch ( ... ) {
145  fatal() << "in sysStart(): UNKNOWN Exception is caught" << endmsg;
146  // Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
147  }
148 
149  return StatusCode::FAILURE;
150 }
151 
152 // IService::sysStop
154  StatusCode sc;
155 
156  try {
158  Gaudi::Guards::AuditorGuard guard( this,
159  // check if we want to audit the initialize
160  ( m_auditorStop ) ? auditorSvc().get() : nullptr, IAuditor::Stop );
161  sc = stop();
162  if ( sc.isSuccess() ) m_state = m_targetState;
163  return sc;
164  } catch ( const GaudiException& Exception ) {
165  fatal() << "in sysStop(): exception with tag=" << Exception.tag() << " is caught" << endmsg;
166  error() << Exception << endmsg;
167  // Stat stat( chronoSvc() , Exception.tag() );
168  } catch ( const std::exception& Exception ) {
169  fatal() << "in sysStop(): standard std::exception is caught" << endmsg;
170  error() << Exception.what() << endmsg;
171  // Stat stat( chronoSvc() , "*std::exception*" );
172  } catch ( ... ) {
173  fatal() << "in sysStop(): UNKNOWN Exception is caught" << endmsg;
174  // Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
175  }
176 
177  return StatusCode::FAILURE;
178 }
179 
180 //--- IService::stop
182  // stub implementation
183  return StatusCode::SUCCESS;
184 }
185 
186 //--- IService::start
188  // stub implementation
189  return StatusCode::SUCCESS;
190 }
191 
192 //--- IService::sysFinalize
194 
196 
197  try {
199  Gaudi::Guards::AuditorGuard guard( this,
200  // check if we want to audit the initialize
201  ( m_auditorFinalize ) ? auditorSvc().get() : nullptr, IAuditor::Finalize );
202  sc = finalize();
203  if ( sc.isSuccess() ) m_state = m_targetState;
204  } catch ( const GaudiException& Exception ) {
205  fatal() << " Exception with tag=" << Exception.tag() << " is caught " << endmsg;
206  error() << Exception << endmsg;
207  // Stat stat( chronoSvc() , Exception.tag() ) ;
208  } catch ( const std::exception& Exception ) {
209  fatal() << " Standard std::exception is caught " << endmsg;
210  error() << Exception.what() << endmsg;
211  // Stat stat( chronoSvc() , "*std::exception*" ) ;
212  } catch ( ... ) {
213  fatal() << "UNKNOWN Exception is caught " << endmsg;
214  // Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
215  }
216 
217  m_pAuditorSvc = nullptr;
218  return sc;
219 }
220 
221 //--- IService::finalize
223  // m_state = Gaudi::StateMachine::ChangeState(Gaudi::StateMachine::TERMINATE,m_state);
224  return StatusCode::SUCCESS;
225 }
226 
227 //--- IService::sysReinitialize
229 
230  StatusCode sc;
231 
232  // Check that the current status is the correct one.
234  error() << "sysReinitialize(): cannot reinitialize service not initialized" << endmsg;
235  return StatusCode::FAILURE;
236  }
237 
238  try {
239 
240  Gaudi::Guards::AuditorGuard guard( this,
241  // check if we want to audit the initialize
242  ( m_auditorReinitialize ) ? auditorSvc().get() : nullptr,
244  sc = reinitialize();
245  return sc;
246  } catch ( const GaudiException& Exception ) {
247  fatal() << " Exception with tag=" << Exception.tag() << " is caught " << endmsg;
248  error() << Exception << endmsg;
249  // Stat stat( chronoSvc() , Exception.tag() ) ;
250  } catch ( const std::exception& Exception ) {
251  fatal() << " Standard std::exception is caught " << endmsg;
252  error() << Exception.what() << endmsg;
253  // Stat stat( chronoSvc() , "*std::exception*" ) ;
254  } catch ( ... ) {
255  fatal() << "UNKNOWN Exception is caught " << endmsg;
256  // Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
257  }
258  return StatusCode::FAILURE;
259 }
260 
261 //--- IService::sysRestart
263 
264  StatusCode sc;
265 
266  // Check that the current status is the correct one.
268  error() << "sysRestart(): cannot restart service in state " << FSMState() << " -- must be RUNNING " << endmsg;
269  return StatusCode::FAILURE;
270  }
271 
272  try {
273 
274  Gaudi::Guards::AuditorGuard guard( this,
275  // check if we want to audit the initialize
276  ( m_auditorRestart ) ? auditorSvc().get() : nullptr, IAuditor::ReStart );
277  sc = restart();
278  return sc;
279  } catch ( const GaudiException& Exception ) {
280  fatal() << " Exception with tag=" << Exception.tag() << " is caught " << endmsg;
281  error() << Exception << endmsg;
282  // Stat stat( chronoSvc() , Exception.tag() ) ;
283  } catch ( const std::exception& Exception ) {
284  fatal() << " Standard std::exception is caught " << endmsg;
285  error() << Exception.what() << endmsg;
286  // Stat stat( chronoSvc() , "*std::exception*" ) ;
287  } catch ( ... ) {
288  fatal() << "UNKNOWN Exception is caught " << endmsg;
289  // Stat stat( chronoSvc() , "*UNKNOWN Exception*" ) ;
290  }
291  return StatusCode::FAILURE;
292 }
293 
294 //--- IService::reinitialize
296  /* @TODO
297  * MCl 2008-10-23: the implementation of reinitialize as finalize+initialize
298  * is causing too many problems
299  *
300  // Default implementation is finalize+initialize
301  StatusCode sc = finalize();
302  if (sc.isFailure()) {
303  error() << "reinitialize(): cannot be finalized" << endmsg;
304  return sc;
305  }
306  sc = initialize();
307  if (sc.isFailure()) {
308  error() << "reinitialize(): cannot be initialized" << endmsg;
309  return sc;
310  }
311  */
312  return StatusCode::SUCCESS;
313 }
314 
315 //--- IService::restart
317  // Default implementation is stop+start
318  StatusCode sc = stop();
319  if ( sc.isFailure() ) {
320  error() << "restart(): cannot be stopped" << endmsg;
321  return sc;
322  }
323  sc = start();
324  if ( sc.isFailure() ) {
325  error() << "restart(): cannot be started" << endmsg;
326  return sc;
327  }
328  return StatusCode::SUCCESS;
329 }
330 
331 //--- IService::getServiceName
332 const std::string& Service::name() const { return m_name; }
333 
334 //--- Retrieve pointer to service locator
336 
337 //--- Local methods
338 // Standard Constructor
339 Service::Service( std::string name, ISvcLocator* svcloc ) : m_name( std::move( name ) ), m_svcLocator( svcloc ) {
340  if ( m_name != "MessageSvc" ) { // the MessageSvc should not notify itself
343  }
344 
345  // Initialize the default value from ApplicationMgr AuditAlgorithms
346  Gaudi::Property<bool> audit( false );
347  auto appMgr = serviceLocator()->service<IProperty>( "ApplicationMgr" );
348  if ( appMgr && appMgr->hasProperty( "AuditServices" ) ) { audit.assign( appMgr->getProperty( "AuditServices" ) ); }
349  m_auditInit = audit;
350  m_auditorInitialize = audit;
351  m_auditorStart = audit;
352  m_auditorStop = audit;
353  m_auditorFinalize = audit;
354  m_auditorReinitialize = audit;
355  m_auditorRestart = audit;
356 }
357 
359  if ( !m_pAuditorSvc ) {
360  m_pAuditorSvc = serviceLocator()->service( "AuditorSvc" );
361  if ( !m_pAuditorSvc ) { throw GaudiException( "Service [AuditorSvc] not found", name(), StatusCode::FAILURE ); }
362  }
363  return m_pAuditorSvc;
364 }
365 
367 
369  auto init_one = [&]( BaseToolHandle* th ) {
370  if ( !th->isEnabled() ) {
371  if ( msgLevel( MSG::DEBUG ) && !th->typeAndName().empty() )
372  debug() << "ToolHandle " << th->typeAndName() << " not used" << endmsg;
373  return;
374  }
375  if ( !th->get() ) {
376  auto sc = th->retrieve();
377  if ( sc.isFailure() ) {
378  throw GaudiException( "Failed to retrieve tool " + th->typeAndName(), this->name(), StatusCode::FAILURE );
379  }
380  }
381  auto* tool = th->get();
382  if ( msgLevel( MSG::DEBUG ) )
383  debug() << "Adding " << ( th->isPublic() ? "public" : "private" ) << " ToolHandle tool " << tool->name() << " ("
384  << tool->type() << ")" << endmsg;
386  };
387 
388  for ( auto thArr : m_toolHandleArrays ) {
389  if ( msgLevel( MSG::DEBUG ) )
390  debug() << "Registering all Tools in ToolHandleArray " << thArr->propertyName() << endmsg;
391  // Iterate over its tools:
392  for ( auto toolHandle : thArr->getBaseArray() ) {
393  // Try to cast it into a BaseToolHandle pointer:
394  BaseToolHandle* bth = dynamic_cast<BaseToolHandle*>( toolHandle );
395  if ( bth ) {
396  init_one( bth );
397  } else {
398  error() << "Error retrieving Tool " << toolHandle->typeAndName() << " in ToolHandleArray "
399  << thArr->propertyName() << ". Not registered" << endmsg;
400  }
401  }
402  }
403 
404  for ( BaseToolHandle* th : m_toolHandles ) init_one( th );
405 
406  m_toolHandlesInit = true;
407 }
408 
411 
412  return m_tools;
413 }
414 
417 
418  return m_tools;
419 }
IDataHandleHolder
Definition: IDataHandleHolder.h:24
Service::m_auditorStart
Gaudi::Property< bool > m_auditorStart
Definition: Service.h:235
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
Service::m_auditorStop
Gaudi::Property< bool > m_auditorStop
Definition: Service.h:236
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:35
std::call_once
T call_once(T... args)
IAuditor::ReStart
@ ReStart
Definition: IAuditor.h:34
Service::m_pAuditorSvc
SmartIF< IAuditorSvc > m_pAuditorSvc
Auditor Service
Definition: Service.h:247
Service::m_toolHandlesInit
bool m_toolHandlesInit
Definition: Service.h:227
Service::m_toolHandleArrays
std::vector< GaudiHandleArrayBase * > m_toolHandleArrays
Definition: Service.h:226
Service::initialize
StatusCode initialize() override
Definition: Service.cpp:118
Service::sysInitialize
StatusCode sysInitialize() override
Initialize Service
Definition: Service.cpp:34
Service::sysRestart
StatusCode sysRestart() override
Re-initialize the Service.
Definition: Service.cpp:262
std::string
STL class.
std::exception
STL class.
Service::sysStart
StatusCode sysStart() override
Initialize Service
Definition: Service.cpp:125
Service::m_state
Gaudi::StateMachine::State m_state
Service state
Definition: Service.h:203
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
Service::m_initSC
StatusCode m_initSC
Definition: Service.h:212
Service::start
StatusCode start() override
Definition: Service.cpp:187
GaudiException.h
Service::sysInitialize_imp
void sysInitialize_imp()
Definition: Service.cpp:39
std::vector< IAlgTool * >
std::unordered_set::size
T size(T... args)
ISvcLocator
Definition: ISvcLocator.h:46
GaudiException
Definition: GaudiException.h:31
GaudiPartProp.decorators.get
get
decorate the vector of properties
Definition: decorators.py:283
Service::m_auditorInitialize
Gaudi::Property< bool > m_auditorInitialize
Definition: Service.h:234
Service::m_svcLocator
SmartIF< ISvcLocator > m_svcLocator
Service Locator reference
Definition: Service.h:218
Service::m_auditorReinitialize
Gaudi::Property< bool > m_auditorReinitialize
Definition: Service.h:238
Service::initToolHandles
void initToolHandles() const
Definition: Service.cpp:368
Gaudi::Property::assign
bool assign(const Details::PropertyBase &source) override
get the value from another property
Definition: Property.h:370
IDataHandleHolder::inputDataObjs
virtual const DataObjIDColl & inputDataObjs() const =0
ISvcManager
Definition: ISvcManager.h:38
Service::sysStop
StatusCode sysStop() override
Initialize Service
Definition: Service.cpp:153
IMessageSvc.h
CommonMessaging< implements< IService, IProperty, IStateful > >::msgLevel
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
Definition: CommonMessaging.h:148
Service::finalize
StatusCode finalize() override
Definition: Service.cpp:222
IAuditorSvc.h
Service::FSMState
Gaudi::StateMachine::State FSMState() const override
Definition: Service.h:62
PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >::bindPropertiesTo
void bindPropertiesTo(Gaudi::Interfaces::IOptionsSvc &optsSvc)
Definition: PropertyHolder.h:252
Gaudi::Guards::AuditorGuard
Definition: Guards.h:213
Service::m_name
std::string m_name
Service Name
Definition: Service.h:216
std::vector::push_back
T push_back(T... args)
Service::m_auditInit
Gaudi::Property< bool > m_auditInit
Definition: Service.h:233
Service::tools
const std::vector< IAlgTool * > & tools() const
Definition: Service.cpp:409
IProperty
Definition: IProperty.h:33
IAuditor::Finalize
@ Finalize
Definition: IAuditor.h:34
Service::m_initFlag
std::once_flag m_initFlag
Definition: Service.h:213
ON_DEBUG
#define ON_DEBUG
Definition: Service.cpp:26
Service::~Service
~Service() override
Standard Destructor
Definition: Service.cpp:29
bug_34121.tool
tool
Definition: bug_34121.py:18
CommonMessaging< implements< IService, IProperty, IStateful > >::setUpMessaging
MSG::Level setUpMessaging() const
Set up local caches.
Definition: CommonMessaging.h:174
Service::name
const std::string & name() const override
Retrieve name of the service
Definition: Service.cpp:332
StatusCode
Definition: StatusCode.h:65
IAuditor::Stop
@ Stop
Definition: IAuditor.h:34
Service::m_tools
std::vector< IAlgTool * > m_tools
Definition: Service.h:224
Service::m_auditorFinalize
Gaudi::Property< bool > m_auditorFinalize
Definition: Service.h:237
IDataHandleHolder::outputDataObjs
virtual const DataObjIDColl & outputDataObjs() const =0
IAuditor::Initialize
@ Initialize
Definition: IAuditor.h:34
IAuditor::ReInitialize
@ ReInitialize
Definition: IAuditor.h:34
Gaudi::StateMachine::OFFLINE
@ OFFLINE
Definition: StateMachine.h:23
Service::m_auditorRestart
Gaudi::Property< bool > m_auditorRestart
Definition: Service.h:239
Gaudi::Property::declareUpdateHandler
Details::PropertyBase & declareUpdateHandler(std::function< void(Details::PropertyBase &)> fun) override
set new callback for update
Definition: Property.h:144
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:237
CommonMessaging< implements< IService, IProperty, IStateful > >::updateMsgStreamOutputLevel
void updateMsgStreamOutputLevel(int level)
Update the output level of the cached MsgStream.
Definition: CommonMessaging.h:185
SmartIF< ISvcLocator >
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
Gaudi::StateMachine::RUNNING
@ RUNNING
Definition: StateMachine.h:26
Service.h
Gaudi::StateMachine::ChangeState
State GAUDI_API ChangeState(const Transition transition, const State state)
Function to get the new state according to the required transition, checking if the transition is all...
Definition: StateMachine.cpp:19
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
IAuditor::Start
@ Start
Definition: IAuditor.h:34
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
Service::stop
StatusCode stop() override
Definition: Service.cpp:181
Service::m_autoRetrieveTools
Gaudi::Property< bool > m_autoRetrieveTools
Definition: Service.h:241
BaseToolHandle
Definition: ToolHandle.h:80
Service::sysFinalize
StatusCode sysFinalize() override
Finalize Service
Definition: Service.cpp:193
IDataHandleHolder.h
ServiceLocatorHelper.h
std
STL namespace.
Gaudi::StateMachine::INITIALIZED
@ INITIALIZED
Definition: StateMachine.h:25
Gaudi::StateMachine::START
@ START
Definition: StateMachine.h:36
Service::m_svcManager
SmartIF< ISvcManager > m_svcManager
Definition: Service.h:219
Service::reinitialize
StatusCode reinitialize() override
Definition: Service.cpp:295
Service::Service
Service(std::string name, ISvcLocator *svcloc)
Standard Constructor
Definition: Service.cpp:339
Service::setServiceManager
void setServiceManager(ISvcManager *ism) override
Definition: Service.cpp:366
Service::sysReinitialize
StatusCode sysReinitialize() override
Re-initialize the Service.
Definition: Service.cpp:228
Service::m_targetState
Gaudi::StateMachine::State m_targetState
Service state
Definition: Service.h:205
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
Guards.h
Service::auditorSvc
SmartIF< IAuditorSvc > & auditorSvc() const
The standard auditor service.May not be invoked before sysInitialize() has been invoked.
Definition: Service.cpp:358
ISvcLocator.h
Service::restart
StatusCode restart() override
Definition: Service.cpp:316
PropertyHolder.h
IOTest.appMgr
appMgr
Definition: IOTest.py:105
Service::m_checkToolDeps
Gaudi::Property< bool > m_checkToolDeps
Definition: Service.h:243
Gaudi::StateMachine::CONFIGURE
@ CONFIGURE
Definition: StateMachine.h:34
Service::m_outputLevel
Gaudi::Property< int > m_outputLevel
flag indicating whether ToolHandle tools have been added to m_tools
Definition: Service.h:232
Gaudi::Property< bool >
Gaudi::StateMachine::STOP
@ STOP
Definition: StateMachine.h:37
ISvcManager.h
MsgStream.h
Service::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator
Definition: Service.cpp:335
Service::m_toolHandles
std::vector< BaseToolHandle * > m_toolHandles
Definition: Service.h:225