The Gaudi Framework  v33r1 (b1225454)
ToolSvc Class Reference

This service manages tools. More...

#include <src/ApplicationMgr/ToolSvc.h>

Inheritance diagram for ToolSvc:
Collaboration diagram for ToolSvc:

Public Member Functions

 ~ToolSvc () override
 Destructor. More...
 
StatusCode initialize () override
 Initialize the service. More...
 
StatusCode finalize () override
 Finalize the service. More...
 
StatusCode start () override
 
StatusCode stop () override
 
StatusCode retrieve (std::string_view type, const InterfaceID &iid, IAlgTool *&tool, const IInterface *parent, bool createIf) override
 Retrieve tool, create it by default as common tool if it does not already exist. More...
 
StatusCode retrieve (std::string_view tooltype, std::string_view toolname, const InterfaceID &iid, IAlgTool *&tool, const IInterface *parent, bool createIf) override
 Retrieve tool, create it by default as common tool if it does not already exist. More...
 
std::vector< std::stringgetInstances (std::string_view toolType) override
 Get names of all tool instances of a given type. More...
 
std::vector< std::stringgetInstances () const override
 Get names of all tool instances. More...
 
std::vector< IAlgTool * > getTools () const override
 Get pointers to all tool instances. More...
 
StatusCode releaseTool (IAlgTool *tool) override
 Release tool. More...
 
StatusCode create (const std::string &type, const IInterface *parent, IAlgTool *&tool)
 Create Tool standard way with automatically assigned name. More...
 
StatusCode create (const std::string &type, const std::string &name, const IInterface *parent, IAlgTool *&tool)
 Create Tool standard way with specified name. More...
 
bool existsTool (std::string_view toolname) const
 Check if the tool instance exists. More...
 
std::string nameTool (std::string_view nameByUser, const IInterface *parent)
 Get Tool full name by combining nameByUser and "parent" part. More...
 
void registerObserver (IToolSvc::Observer *obs) override
 
- Public Member Functions inherited from extends< Service, IToolSvc >
void * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast. More...
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface. More...
 
std::vector< std::stringgetInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
- Public Member Functions inherited from Service
const std::stringname () const override
 Retrieve name of the service. More...
 
StatusCode configure () override
 
StatusCode initialize () override
 
StatusCode start () override
 
StatusCode stop () override
 
StatusCode finalize () override
 
StatusCode terminate () override
 
Gaudi::StateMachine::State FSMState () const override
 
Gaudi::StateMachine::State targetFSMState () const override
 
StatusCode reinitialize () override
 
StatusCode restart () override
 
StatusCode sysInitialize () override
 Initialize Service. More...
 
StatusCode sysStart () override
 Initialize Service. More...
 
StatusCode sysStop () override
 Initialize Service. More...
 
StatusCode sysFinalize () override
 Finalize Service. More...
 
StatusCode sysReinitialize () override
 Re-initialize the Service. More...
 
StatusCode sysRestart () override
 Re-initialize the Service. More...
 
 Service (std::string name, ISvcLocator *svcloc)
 Standard Constructor. More...
 
SmartIF< ISvcLocator > & serviceLocator () const override
 Retrieve pointer to service locator. More...
 
StatusCode setProperties ()
 Method for setting declared properties to the values specified for the job. More...
 
template<class T >
StatusCode service (const std::string &name, const T *&psvc, bool createIf=true) const
 Access a service by name, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode service (const std::string &name, T *&psvc, bool createIf=true) const
 
template<typename IFace = IService>
SmartIF< IFace > service (const std::string &name, bool createIf=true) const
 
template<class T >
StatusCode service (const std::string &svcType, const std::string &svcName, T *&psvc) const
 Access a service by name and type, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode declareTool (ToolHandle< T > &handle, std::string toolTypeAndName, bool createIf=true)
 Declare used tool. More...
 
SmartIF< IAuditorSvc > & auditorSvc () const
 The standard auditor service.May not be invoked before sysInitialize() has been invoked. More...
 
- Public Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 PropertyHolder ()=default
 
Gaudi::Details::PropertyBasedeclareProperty (Gaudi::Details::PropertyBase &prop)
 Declare a property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, TYPE &value, const std::string &doc="none")
 Helper to wrap a regular data member and use it as a regular property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, Gaudi::Property< TYPE, VERIFIER, HANDLERS > &prop, const std::string &doc="none")
 Declare a PropertyBase instance setting name and documentation. More...
 
Gaudi::Details::PropertyBasedeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="")
 Declare a remote property. More...
 
StatusCode setProperty (const Gaudi::Details::PropertyBase &p) override
 set the property form another property More...
 
StatusCode setProperty (const std::string &s) override
 set the property from the formatted string More...
 
StatusCode setProperty (const std::string &n, const std::string &v) override
 set the property from name and the value More...
 
StatusCode setProperty (const std::string &name, const TYPE &value)
 set the property form the value More...
 
StatusCode getProperty (Gaudi::Details::PropertyBase *p) const override
 get the property More...
 
const Gaudi::Details::PropertyBasegetProperty (const std::string &name) const override
 get the property by name More...
 
StatusCode getProperty (const std::string &n, std::string &v) const override
 convert the property to the string More...
 
const std::vector< Gaudi::Details::PropertyBase * > & getProperties () const override
 get all properties More...
 
bool hasProperty (const std::string &name) const override
 Return true if we have a property with the given name. More...
 
 PropertyHolder (const PropertyHolder &)=delete
 
PropertyHolderoperator= (const PropertyHolder &)=delete
 
- Public Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level msgLevel () const
 get the cached level (originally extracted from the embedded MsgStream) More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 
- Public Member Functions inherited from CommonMessagingBase
virtual ~CommonMessagingBase ()=default
 Virtual destructor. More...
 
const SmartIF< IMessageSvc > & msgSvc () const
 The standard message service. More...
 
MsgStreammsgStream () const
 Return an uninitialized MsgStream. More...
 
MsgStreammsgStream (const MSG::Level level) const
 Predefined configurable message stream for the efficient printouts. More...
 
MsgStreamalways () const
 shortcut for the method msgStream(MSG::ALWAYS) More...
 
MsgStreamfatal () const
 shortcut for the method msgStream(MSG::FATAL) More...
 
MsgStreamerr () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamerror () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamwarning () const
 shortcut for the method msgStream(MSG::WARNING) More...
 
MsgStreaminfo () const
 shortcut for the method msgStream(MSG::INFO) More...
 
MsgStreamdebug () const
 shortcut for the method msgStream(MSG::DEBUG) More...
 
MsgStreamverbose () const
 shortcut for the method msgStream(MSG::VERBOSE) More...
 
MsgStreammsg () const
 shortcut for the method msgStream(MSG::INFO) More...
 

Private Types

typedef std::recursive_mutex CallMutex
 

Private Member Functions

unsigned long totalToolRefCount () const
 The total number of refCounts on all tools in the instancesTools list. More...
 
unsigned long minimumToolRefCount () const
 The minimum number of refCounts of all tools. More...
 
StatusCode finalizeTool (IAlgTool *itool) const
 Finalize the given tool, with exception handling. More...
 

Private Attributes

std::vector< IAlgTool * > m_instancesTools
 Common Tools. More...
 
IHistorySvcm_pHistorySvc = nullptr
 Pointer to HistorySvc. More...
 
std::vector< IToolSvc::Observer * > m_observers
 
CallMutex m_mut
 

Additional Inherited Members

- Public Types inherited from extends< Service, IToolSvc >
using base_class = extends
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces... >
 Typedef to the base of this class. More...
 
- Public Types inherited from Service
using Factory = Gaudi::PluginService::Factory< IService *(const std::string &, ISvcLocator *)>
 
- Public Types inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
using PropertyHolderImpl = PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 Typedef used to refer to this class from derived classes, as in. More...
 
- Public Types inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
using base_class = CommonMessaging
 
- Public Types inherited from extend_interfaces< Interfaces... >
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids... >::type
 take union of the ext_iids of all Interfaces... More...
 
- Protected Member Functions inherited from Service
 ~Service () override
 Standard Destructor. More...
 
int outputLevel () const
 get the Service's output level More...
 
- Protected Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
Gaudi::Details::PropertyBaseproperty (const std::string &name) const
 
- Protected Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level setUpMessaging () const
 Set up local caches. More...
 
MSG::Level resetMessaging ()
 Reinitialize internal states. More...
 
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 
- Protected Attributes inherited from Service
Gaudi::StateMachine::State m_state = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::StateMachine::State m_targetState = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::Property< int > m_outputLevel {this, "OutputLevel", MSG::NIL, "output level"}
 
Gaudi::Property< bool > m_auditInit {this, "AuditServices", false, " unused"}
 
Gaudi::Property< bool > m_auditorInitialize {this, "AuditInitialize", false, "trigger auditor on initialize()"}
 
Gaudi::Property< bool > m_auditorStart {this, "AuditStart", false, "trigger auditor on start()"}
 
Gaudi::Property< bool > m_auditorStop {this, "AuditStop", false, "trigger auditor on stop()"}
 
Gaudi::Property< bool > m_auditorFinalize {this, "AuditFinalize", false, "trigger auditor on finalize()"}
 
Gaudi::Property< bool > m_auditorReinitialize {this, "AuditReinitialize", false, "trigger auditor on reinitialize()"}
 
Gaudi::Property< bool > m_auditorRestart {this, "AuditRestart", false, "trigger auditor on restart()"}
 
SmartIF< IAuditorSvcm_pAuditorSvc
 Auditor Service. More...
 

Detailed Description

This service manages tools.

Tools can be common, in which case a single instance can be shared by different algorithms, or private in which case it is necessary to specify the parent when requesting it. The parent of a tool can be an algortihm or a Service The environment of a tool is set by using that of the parent. A common tool is considered to belong to the ToolSvc itself.

Author
G. Corti, P. Mato

Definition at line 34 of file ToolSvc.h.

Member Typedef Documentation

◆ CallMutex

Definition at line 108 of file ToolSvc.h.

Constructor & Destructor Documentation

◆ ~ToolSvc()

ToolSvc::~ToolSvc ( )
override

Destructor.

Definition at line 56 of file ToolSvc.cpp.

56  {
57  // tell the remaining observers that we're gone, and forget about unregistering..
59  [&]( IToolSvc::Observer* obs ) { obs->setUnregister( {} ); } );
60 }
allow call-backs when a tool is a created or retrieved
Definition: IToolSvc.h:230
T end(T... args)
std::vector< IToolSvc::Observer * > m_observers
Definition: ToolSvc.h:106
void setUnregister(std::function< void()> unregister)
Definition: IToolSvc.h:235
T begin(T... args)
T for_each(T... args)

Member Function Documentation

◆ create() [1/2]

StatusCode ToolSvc::create ( const std::string type,
const IInterface parent,
IAlgTool *&  tool 
)

Create Tool standard way with automatically assigned name.

Definition at line 386 of file ToolSvc.cpp.

388 {
389  const std::string& toolname = tooltype;
390  return create( tooltype, toolname, parent, tool );
391 }
StatusCode create(const std::string &type, const IInterface *parent, IAlgTool *&tool)
Create Tool standard way with automatically assigned name.
Definition: ToolSvc.cpp:386
STL class.
const Gaudi::Algorithm & parent

◆ create() [2/2]

StatusCode ToolSvc::create ( const std::string tooltype,
const std::string toolname,
const IInterface parent,
IAlgTool *&  tool 
)

Create Tool standard way with specified name.

Now able to handle clones.

The test of tool existence is performed according to three criteria: name, type and parent. If a tool is private, i.e. the parent is not the tool Svc, and it exist but the parent is not the specified one, a clone is handed over. No clones of public tools are allowed since they would be undistinguishable.

invoke create callbacks...

Definition at line 445 of file ToolSvc.cpp.

448 {
449 
450  auto lock = std::scoped_lock{m_mut};
451  // protect against empty type
452  if ( UNLIKELY( tooltype.empty() ) ) {
453  error() << "create(): No Tool Type given" << endmsg;
454  return StatusCode::FAILURE;
455  }
456 
457  // If parent has not been specified, assume it is the ToolSvc
458  if ( !parent ) parent = this;
459 
460  tool = nullptr;
461  // Automatically deletes the tool if not explicitly kept (i.e. on success).
462  // The tool is removed from the list of known tools too.
463  auto toolguard = make_toolCreateGuard( m_instancesTools );
464 
465  // Check if the tool already exist : this could happen with clones
466  std::string fullname = nameTool( toolname, parent );
467  if ( UNLIKELY( existsTool( fullname ) ) ) {
468  // Now check if the parent is the same. This allows for clones
469  for ( IAlgTool* iAlgTool : m_instancesTools ) {
470  if ( iAlgTool->name() == toolname && iAlgTool->parent() == parent ) {
471  // The tool exist with this name, type and parent: this is bad!
472  // This excludes the possibility of cloning public tools intrinsecally
473  error() << "Tool " << fullname << " already exists with the same parent" << endmsg;
474  if ( parent == this )
475  error() << "... In addition, the parent is the ToolSvc: public tools cannot be cloned!" << endmsg;
476 
477  return StatusCode::FAILURE;
478  }
479  }
480  ON_DEBUG debug() << "Creating clone of " << fullname << endmsg;
481  }
482  // instantiate the tool using the factory
483  try {
484  toolguard.create( tooltype, fullname, parent );
485  if ( UNLIKELY( !toolguard.get() ) ) {
486  error() << "Cannot create tool " << tooltype << " (No factory found)" << endmsg;
487  return StatusCode::FAILURE;
488  }
489  } catch ( const GaudiException& Exception ) {
490  // (1) perform the printout of message
491  fatal() << "Exception with tag=" << Exception.tag() << " is caught whilst instantiating tool '" << tooltype << "'"
492  << endmsg;
493  // (2) print the exception itself
494  // (NB! - GaudiException is a linked list of all "previous exceptions")
495  fatal() << Exception << endmsg;
496  return StatusCode::FAILURE;
497  } catch ( const std::exception& Exception ) {
498  // (1) perform the printout of message
499  fatal() << "Standard std::exception is caught whilst instantiating tool '" << tooltype << "'" << endmsg;
500  // (2) print the exception itself
501  // (NB! - GaudiException is a linked list of all "previous exceptions")
502  fatal() << Exception.what() << endmsg;
503  return StatusCode::FAILURE;
504  } catch ( ... ) {
505  // (1) perform the printout
506  fatal() << "UNKNOWN Exception is caught whilst instantiating tool '" << tooltype << "'" << endmsg;
507  return StatusCode::FAILURE;
508  }
509  ON_VERBOSE verbose() << "Created tool " << tooltype << "/" << fullname << endmsg;
510 
511  // Since only AlgTool has the setProperties() method it is necessary to cast
512  // to downcast IAlgTool to AlgTool in order to set the properties via the JobOptions
513  // service
514  AlgTool* mytool = dynamic_cast<AlgTool*>( toolguard.get() );
515  if ( mytool ) {
516  StatusCode sc = mytool->setProperties();
517  if ( UNLIKELY( sc.isFailure() ) ) {
518  error() << "Error setting properties for tool '" << fullname << "'" << endmsg;
519  return sc;
520  }
521  }
522 
523  // Initialize the Tool
524  StatusCode sc( StatusCode::FAILURE, true );
525  try {
526  sc = toolguard->sysInitialize();
527  }
528  // Catch any exceptions
529  catch ( const GaudiException& Exception ) {
530  error() << "GaudiException with tag=" << Exception.tag() << " caught whilst initializing tool '" << fullname << "'"
531  << endmsg << Exception << endmsg;
532  return StatusCode::FAILURE;
533  } catch ( const std::exception& Exception ) {
534  error() << "Standard std::exception caught whilst initializing tool '" << fullname << "'" << endmsg
535  << Exception.what() << endmsg;
536  return StatusCode::FAILURE;
537  } catch ( ... ) {
538  error() << "UNKNOWN Exception caught whilst initializing tool '" << fullname << "'" << endmsg;
539  return StatusCode::FAILURE;
540  }
541 
542  // Status of tool initialization
543  if ( UNLIKELY( sc.isFailure() ) ) {
544  error() << "Error initializing tool '" << fullname << "'" << endmsg;
545  return sc;
546  }
547 
548  // Start the tool if we are running.
550  sc = toolguard->sysStart();
551 
552  if ( UNLIKELY( sc.isFailure() ) ) {
553  error() << "Error starting tool '" << fullname << "'" << endmsg;
554  return sc;
555  }
556  }
557 
558  // The tool has been successfully created and initialized,
559  // so we inform the guard that it can release it
560  tool = toolguard.release();
561 
565  std::for_each( m_observers.begin(), m_observers.end(), [&]( IToolSvc::Observer* obs ) { obs->onCreate( tool ); } );
566  // TODO: replace by generic callback
567  // Register the tool with the HistorySvc
568  if ( m_pHistorySvc || service( "HistorySvc", m_pHistorySvc, false ).isSuccess() ) {
570  }
571  return StatusCode::SUCCESS;
572 }
IHistorySvc * m_pHistorySvc
Pointer to HistorySvc.
Definition: ToolSvc.h:104
#define UNLIKELY(x)
Definition: Kernel.h:106
T empty(T... args)
Define general base for Gaudi exception.
Gaudi::StateMachine::State m_state
Service state.
Definition: Service.h:163
allow call-backs when a tool is a created or retrieved
Definition: IToolSvc.h:230
virtual const std::string & tag() const
name tag for the exception, or exception type
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
T end(T... args)
std::vector< IToolSvc::Observer * > m_observers
Definition: ToolSvc.h:106
StatusCode setProperties()
Method for setting declared properties to the values specified in the jobOptions via the job option s...
Definition: AlgTool.cpp:117
STL class.
virtual void onCreate(const IAlgTool *)
Definition: IToolSvc.h:237
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
T what(T... args)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:61
virtual StatusCode registerAlgTool(const IAlgTool &)=0
std::string nameTool(std::string_view nameByUser, const IInterface *parent)
Get Tool full name by combining nameByUser and "parent" part.
Definition: ToolSvc.cpp:575
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
T lock(T... args)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
bool isSuccess() const
Definition: StatusCode.h:365
STL class.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:168
virtual unsigned long release()=0
Release Interface instance.
bool existsTool(std::string_view toolname) const
Check if the tool instance exists.
Definition: ToolSvc.cpp:594
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
T begin(T... args)
Base class from which all the concrete tool classes should be derived.
Definition: AlgTool.h:57
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:33
#define ON_DEBUG
Definition: ToolSvc.cpp:31
constexpr static const auto FAILURE
Definition: StatusCode.h:101
const Gaudi::Algorithm & parent
StatusCode service(const std::string &name, const T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn't already exist.
Definition: Service.h:93
bool isFailure() const
Definition: StatusCode.h:145
CallMutex m_mut
Definition: ToolSvc.h:109
T for_each(T... args)
#define ON_VERBOSE
Definition: ToolSvc.cpp:32
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ existsTool()

bool ToolSvc::existsTool ( std::string_view  toolname) const

Check if the tool instance exists.

Definition at line 594 of file ToolSvc.cpp.

596 {
597  auto lock = std::scoped_lock{m_mut};
599  [&]( const IAlgTool* tool ) { return tool->name() == fullname; } );
600  return i != std::end( m_instancesTools );
601 }
T end(T... args)
virtual const std::string & name() const =0
Retrieve the name of the instance.
T lock(T... args)
T find_if(T... args)
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
T begin(T... args)
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:33
CallMutex m_mut
Definition: ToolSvc.h:109

◆ finalize()

StatusCode ToolSvc::finalize ( )
override

Finalize the service.

Algorithm: 2 passes. First pass:

  • do not explicitly release any tools
  • finalize tools, in the order of increasing number of refCounts Second pass:
  • explicitly release all tools, one release() on all tools per loop. -> tools are deleted in the order of increasing number of refCounts.

Inner loop: full loop over all left-over tools

  • finalize tools with the minimum number of refCounts in the list.
  • Remove finalized tools from list of tools, and add them to the list of finalized tools, to be deleted at the end. This way, any non-finalized tools who still reference already finalized tools in their finalize() will still find a live tool. Outer loop: keep on going until nothing changes in the list of tools. Checking for:
  • number of left-over tools
  • total number of refcounts
  • minimum number of refcounts

Definition at line 83 of file ToolSvc.cpp.

85 {
86  // Finalize and delete all left-over tools. Normally all tools created with
87  // ToolSvc are left over, since ToolSvc holds a refCount (via AlgTool ctor).
88  // Several cases need to be covered:
89  // 1) Simple dependencies: no circular dependencies between tools,
90  // and tools not using other tools
91  // 2) Tools-using-tools (but no circular dependencies)
92  // a) release() is called in the tool::finalize() (e.g. via GaudiAlgorithm)
93  // b) release() is called in the tool destructor (e.g. via ToolHandle)
94  // 3) Circular dependencies between tools
95  // a) release() is called in the tool::finalize() (e.g. via GaudiAlgorithm)
96  // b) release() is called in the tool destructor (e.g. via ToolHandle)
97  // 4) In addition to each of the above cases, refCounting of a particular tool
98  // might not have been done correctly in the code. Typically release()
99  // is not called, so we are left with a too high refCount.
100  // What to do with those, and how to avoid a crash while handling them...
101 
110  info() << "Removing all tools created by ToolSvc" << endmsg;
111 
112  // Print out list of tools
113  ON_DEBUG {
114  auto& log = debug();
115  log << " Tool List : ";
116  for ( const auto& iTool : m_instancesTools ) { log << iTool->name() << ":" << iTool->refCount() << " "; }
117  log << endmsg;
118  }
119 
120  //
121  // first pass: Finalize all tools (but don't delete them)
122  //
135  boost::circular_buffer<IAlgTool*> finalizedTools( m_instancesTools.size() ); // list of tools that have been finalized
136  bool fail( false );
137  size_t toolCount = m_instancesTools.size();
138  unsigned long startRefCount = 0;
139  unsigned long endRefCount = totalToolRefCount();
140  unsigned long startMinRefCount = 0;
141  unsigned long endMinRefCount = minimumToolRefCount();
142  while ( toolCount > 0 && endRefCount > 0 && ( endRefCount != startRefCount || endMinRefCount != startMinRefCount ) ) {
143  ON_DEBUG if ( endMinRefCount != startMinRefCount ) {
144  debug() << toolCount << " tools left to finalize. Summed refCounts: " << endRefCount << endmsg;
145  debug() << "Will finalize tools with refCount <= " << endMinRefCount << endmsg;
146  }
147  startMinRefCount = endMinRefCount;
148  startRefCount = endRefCount;
149  unsigned long maxLoop = toolCount + 1;
150  while ( --maxLoop > 0 && !m_instancesTools.empty() ) {
151  IAlgTool* pTool = m_instancesTools.back();
152  // removing tool from list makes ToolSvc::releaseTool( IAlgTool* ) a noop
154  unsigned long count = pTool->refCount();
155  // cache tool name
156  const std::string& toolName = pTool->name();
157  if ( count <= startMinRefCount ) {
158  ON_DEBUG debug() << " Performing finalization of " << toolName << " (refCount " << count << ")" << endmsg;
159  // finalize of one tool may trigger a release of another tool
160  // pTool->sysFinalize().ignore();
161  if ( !finalizeTool( pTool ).isSuccess() ) {
162  warning() << " FAILURE finalizing " << toolName << endmsg;
163  fail = true;
164  }
165  // postpone deletion
166  finalizedTools.push_back( pTool );
167  } else {
168  // Place back at the front of the list to try again later
169  // ToolSvc::releaseTool( IAlgTool* ) remains active for this tool
170  ON_DEBUG debug() << " Delaying finalization of " << toolName << " (refCount " << count << ")" << endmsg;
172  }
173  } // end of inner loop
174  toolCount = m_instancesTools.size();
175  endRefCount = totalToolRefCount();
176  endMinRefCount = minimumToolRefCount();
177  }; // end of outer loop
178 
179  //
180  // Second pass: Delete all finalized tools
181  //
182  // Delete in the order of increasing number of refCounts.
183  // Loop over tools in the same order as the order in which they were finalized.
184  // All tools in the list of finalized tools are no longer in the instancesTools list.
185  // If a tool destructor calls releaseTool() on another tool, this will have no
186  // effect on the 'other tool' if this 'other tool' is in the list of finalized tools.
187  // If this 'other tool' is still in the instancesTools list, it may trigger finalization
188  // (in releaseTool()), deletion and removal from the instancesTools list.
189  // Therefore, the check on non-finalised tools should happen *after* the deletion
190  // of the finalized tools.
191  ON_DEBUG debug() << "Deleting " << finalizedTools.size() << " finalized tools" << endmsg;
192  auto maxLoop = totalRefCount( finalizedTools ) + 1;
193  while ( --maxLoop > 0 && !finalizedTools.empty() ) {
194  IAlgTool* pTool = finalizedTools.front();
195  finalizedTools.pop_front();
196  auto count = pTool->refCount();
197  if ( count == 1 ) {
198  ON_DEBUG debug() << " Performing deletion of " << pTool->name() << endmsg;
199  } else {
200  ON_VERBOSE verbose() << " Delaying deletion of " << pTool->name() << " (refCount " << count << ")" << endmsg;
201  // Move to the end when refCount still not zero
202  finalizedTools.push_back( pTool );
203  }
204  // do a forced release
205  pTool->release();
206  }
207 
208  // Error if by now not all tools are properly finalised
209  if ( !m_instancesTools.empty() ) {
210  error() << "Unable to finalize and delete the following tools : ";
211  for ( const auto& iTool : m_instancesTools ) { error() << iTool->name() << ": " << iTool->refCount() << " "; }
212  error() << endmsg;
213  }
214 
215  // by now, all tools should be deleted and removed.
216  if ( !finalizedTools.empty() ) {
217  error() << "Failed to delete the following " << finalizedTools.size()
218  << " finalized tools. Bug in ToolSvc::finalize()?: ";
219  for ( const auto& iTool : finalizedTools ) { error() << iTool->name() << ": " << iTool->refCount() << " "; }
220  error() << endmsg;
221  }
222 
223  if ( m_pHistorySvc ) m_pHistorySvc->release();
224 
225  // Finalize this specific service
226  return ( Service::finalize().isSuccess() && !fail ) ? StatusCode::SUCCESS : StatusCode::FAILURE;
227 }
IHistorySvc * m_pHistorySvc
Pointer to HistorySvc.
Definition: ToolSvc.h:104
T empty(T... args)
StatusCode finalize() override
Definition: Service.cpp:174
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
unsigned long minimumToolRefCount() const
The minimum number of refCounts of all tools.
Definition: ToolSvc.cpp:640
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
virtual const std::string & name() const =0
Retrieve the name of the instance.
STL class.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
virtual unsigned long refCount() const =0
Current reference count.
T pop_back(T... args)
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
T count(T... args)
T insert(T... args)
unsigned long totalToolRefCount() const
The total number of refCounts on all tools in the instancesTools list.
Definition: ToolSvc.cpp:634
T size(T... args)
virtual unsigned long release()=0
Release Interface instance.
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
T begin(T... args)
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:33
#define ON_DEBUG
Definition: ToolSvc.cpp:31
T back(T... args)
constexpr static const auto FAILURE
Definition: StatusCode.h:101
StatusCode finalizeTool(IAlgTool *itool) const
Finalize the given tool, with exception handling.
Definition: ToolSvc.cpp:604
#define ON_VERBOSE
Definition: ToolSvc.cpp:32
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ finalizeTool()

StatusCode ToolSvc::finalizeTool ( IAlgTool itool) const
private

Finalize the given tool, with exception handling.

Definition at line 604 of file ToolSvc.cpp.

606 {
607 
608  // Cache tool name in case of errors
609  const auto& toolName = itool->name();
610  StatusCode sc;
611 
612  // Finalise the tool inside a try block
613  try {
614  sc = itool->sysFinalize();
615  }
616  // Catch any exceptions
617  catch ( const GaudiException& Exception ) {
618  error() << "GaudiException with tag=" << Exception.tag() << " caught whilst finalizing tool '" << toolName << "'"
619  << endmsg << Exception << endmsg;
620  sc = StatusCode::FAILURE;
621  } catch ( const std::exception& Exception ) {
622  error() << "Standard std::exception caught whilst finalizing tool '" << toolName << "'" << endmsg
623  << Exception.what() << endmsg;
624  sc = StatusCode::FAILURE;
625  } catch ( ... ) {
626  error() << "UNKNOWN Exception caught whilst finalizing tool '" << toolName << "'" << endmsg;
627  sc = StatusCode::FAILURE;
628  }
629 
630  return sc;
631 }
Define general base for Gaudi exception.
virtual const std::string & tag() const
name tag for the exception, or exception type
virtual StatusCode sysFinalize()=0
Finalization of the Tool.
virtual const std::string & name() const =0
Retrieve the name of the instance.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
T what(T... args)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:61
STL class.
constexpr static const auto FAILURE
Definition: StatusCode.h:101
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ getInstances() [1/2]

std::vector< std::string > ToolSvc::getInstances ( std::string_view  toolType)
override

Get names of all tool instances of a given type.

Definition at line 327 of file ToolSvc.cpp.

329 {
330 
331  auto lock = std::scoped_lock{m_mut};
333  for ( const auto& tool : m_instancesTools ) {
334  if ( tool->type() == toolType ) tools.push_back( tool->name() );
335  }
336  return tools;
337 }
T push_back(T... args)
T lock(T... args)
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
CallMutex m_mut
Definition: ToolSvc.h:109

◆ getInstances() [2/2]

std::vector< std::string > ToolSvc::getInstances ( ) const
override

Get names of all tool instances.

Definition at line 339 of file ToolSvc.cpp.

341 {
342  auto lock = std::scoped_lock{m_mut};
345  []( const IAlgTool* t ) { return t->name(); } );
346  return tools;
347 }
T end(T... args)
virtual const std::string & name() const =0
Retrieve the name of the instance.
T lock(T... args)
T size(T... args)
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
T begin(T... args)
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:33
T transform(T... args)
CallMutex m_mut
Definition: ToolSvc.h:109

◆ getTools()

std::vector< IAlgTool * > ToolSvc::getTools ( ) const
override

Get pointers to all tool instances.

Definition at line 349 of file ToolSvc.cpp.

351 {
352  auto lock = std::scoped_lock{m_mut};
354 }
T end(T... args)
T lock(T... args)
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
T begin(T... args)
CallMutex m_mut
Definition: ToolSvc.h:109

◆ initialize()

StatusCode ToolSvc::initialize ( )
override

Initialize the service.

Definition at line 62 of file ToolSvc.cpp.

64 {
65 
66  // initialize the Service Base class
68  if ( UNLIKELY( status.isFailure() ) ) {
69  error() << "Unable to initialize the Service" << endmsg;
70  return status;
71  }
72 
73  // set my own (ToolSvc) properties via the jobOptionService
74  if ( UNLIKELY( setProperties().isFailure() ) ) {
75  error() << "Unable to set base properties" << endmsg;
76  return StatusCode::FAILURE;
77  }
78 
79  return status;
80 }
#define UNLIKELY(x)
Definition: Kernel.h:106
StatusCode initialize() override
Definition: Service.cpp:70
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:61
StatusCode setProperties()
Method for setting declared properties to the values specified for the job.
Definition: Service.cpp:290
constexpr static const auto FAILURE
Definition: StatusCode.h:101
bool isFailure() const
Definition: StatusCode.h:145
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ minimumToolRefCount()

unsigned long ToolSvc::minimumToolRefCount ( ) const
private

The minimum number of refCounts of all tools.

Definition at line 640 of file ToolSvc.cpp.

642 {
643  auto i =
645  []( const IAlgTool* lhs, const IAlgTool* rhs ) { return lhs->refCount() < rhs->refCount(); } );
646  return i != std::end( m_instancesTools ) ? ( *i )->refCount() : 0;
647 }
T end(T... args)
virtual unsigned long refCount() const =0
Current reference count.
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
T begin(T... args)
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:33
T min_element(T... args)

◆ nameTool()

std::string ToolSvc::nameTool ( std::string_view  nameByUser,
const IInterface parent 
)

Get Tool full name by combining nameByUser and "parent" part.

Definition at line 575 of file ToolSvc.cpp.

577 {
578 
579  if ( !parent ) { return std::string{this->name()}.append( "." ).append( toolname ); } // RETURN
580 
581  // check that parent has a name!
582  auto named_parent = SmartIF<INamedInterface>( const_cast<IInterface*>( parent ) );
583  if ( named_parent ) {
584  auto fullname = std::string{named_parent->name()}.append( "." ).append( toolname );
585  return fullname; // RETURN
586  }
587 
588  error() << "Private Tools only allowed for components implementing INamedInterface" << endmsg;
589  //
590  return std::string{"."}.append( toolname );
591 }
STL class.
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:284
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
T append(T... args)
const Gaudi::Algorithm & parent
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ registerObserver()

void ToolSvc::registerObserver ( IToolSvc::Observer obs)
override

Definition at line 650 of file ToolSvc.cpp.

650  {
651  //------------------------------------------------------------------------------
652  if ( !obs ) throw GaudiException( "Received NULL pointer", this->name() + "::registerObserver", StatusCode::FAILURE );
653 
654  auto lock = std::scoped_lock{m_mut};
655  obs->setUnregister( [this, obs]() {
656  auto lock = std::scoped_lock{m_mut};
657  auto i = std::find( m_observers.begin(), m_observers.end(), obs );
658  if ( i != m_observers.end() ) m_observers.erase( i );
659  } );
660  m_observers.push_back( obs );
661 }
Define general base for Gaudi exception.
T end(T... args)
std::vector< IToolSvc::Observer * > m_observers
Definition: ToolSvc.h:106
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:284
T push_back(T... args)
T erase(T... args)
T lock(T... args)
T find(T... args)
void setUnregister(std::function< void()> unregister)
Definition: IToolSvc.h:235
T begin(T... args)
constexpr static const auto FAILURE
Definition: StatusCode.h:101
CallMutex m_mut
Definition: ToolSvc.h:109

◆ releaseTool()

StatusCode ToolSvc::releaseTool ( IAlgTool tool)
override

Release tool.

Definition at line 356 of file ToolSvc.cpp.

358 {
359  auto lock = std::scoped_lock{m_mut};
361  // test if tool is in known list (protect trying to access a previously deleted tool)
363  unsigned long count = tool->refCount();
364  if ( count == 1 ) {
365  // finalize the tool
366 
368  // We are being called during ToolSvc::finalize()
369  // message format matches the one in ToolSvc::finalize()
370  debug() << " Performing finalization of " << tool->name() << " (refCount " << count << ")" << endmsg;
371  // message format matches the one in ToolSvc::finalize()
372  debug() << " Performing deletion of " << tool->name() << endmsg;
373  } else {
374  debug() << "Performing finalization and deletion of " << tool->name() << endmsg;
375  }
376  sc = finalizeTool( tool );
377  // remove from known tools...
378  remove( m_instancesTools, tool );
379  }
380  tool->release();
381  }
382  return sc;
383 }
Gaudi::StateMachine::State m_targetState
Service state.
Definition: Service.h:165
T rend(T... args)
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
T remove(T... args)
virtual const std::string & name() const =0
Retrieve the name of the instance.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:61
virtual unsigned long refCount() const =0
Current reference count.
T lock(T... args)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
T count(T... args)
T find(T... args)
virtual unsigned long release()=0
Release Interface instance.
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
StatusCode finalizeTool(IAlgTool *itool) const
Finalize the given tool, with exception handling.
Definition: ToolSvc.cpp:604
CallMutex m_mut
Definition: ToolSvc.h:109
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
T rbegin(T... args)

◆ retrieve() [1/2]

StatusCode ToolSvc::retrieve ( std::string_view  type,
const InterfaceID iid,
IAlgTool *&  tool,
const IInterface parent,
bool  createIf 
)
override

Retrieve tool, create it by default as common tool if it does not already exist.

Definition at line 239 of file ToolSvc.cpp.

242 {
243  // check for tools, which by name are required to be public:
244  if ( ba::ends_with( tooltype, s_PUBLIC ) ) {
245  // parent for PUBLIC tool is 'this', i.e. ToolSvc
246  tooltype.remove_suffix( s_PUBLIC.size() );
247  return retrieve( tooltype, iid, tool, this, createIf );
248  }
249 
250  // protect against empty type
251  if ( tooltype.empty() ) {
252  error() << "retrieve(): No Tool Type/Name given" << endmsg;
253  return StatusCode::FAILURE;
254  }
255  auto pos = tooltype.find( '/' );
256  if ( std::string_view::npos == pos ) { return retrieve( tooltype, tooltype, iid, tool, parent, createIf ); }
257  return retrieve( tooltype.substr( 0, pos ), tooltype.substr( pos + 1 ), iid, tool, parent, createIf );
258 }
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
constexpr static const auto FAILURE
Definition: StatusCode.h:101
const Gaudi::Algorithm & parent
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
StatusCode retrieve(std::string_view type, const InterfaceID &iid, IAlgTool *&tool, const IInterface *parent, bool createIf) override
Retrieve tool, create it by default as common tool if it does not already exist.
Definition: ToolSvc.cpp:239

◆ retrieve() [2/2]

StatusCode ToolSvc::retrieve ( std::string_view  tooltype,
std::string_view  toolname,
const InterfaceID iid,
IAlgTool *&  tool,
const IInterface parent,
bool  createIf 
)
override

Retrieve tool, create it by default as common tool if it does not already exist.

invoke retrieve callbacks...

Definition at line 263 of file ToolSvc.cpp.

266 {
267  // check the applicability of another method:
268  // ignore the provided name if it is empty or the type contains a name
269  if ( toolname.empty() || ( std::string_view::npos != tooltype.find( '/' ) ) ) {
270  return retrieve( tooltype, iid, tool, parent, createIf );
271  }
272 
273  // check for tools, which by name are required to be public:
274  if ( ba::ends_with( toolname, s_PUBLIC ) ) {
275  // parent for PUBLIC tool is this, i.e. ToolSvc
276  toolname.remove_suffix( s_PUBLIC.size() );
277  return retrieve( tooltype, toolname, iid, tool, this, createIf );
278  }
279 
280  auto lock = std::scoped_lock{m_mut};
281 
282  IAlgTool* itool = nullptr;
284 
285  tool = nullptr;
286 
287  // If parent is not specified it means it is the ToolSvc itself
288  if ( !parent ) parent = this;
289  const std::string fullname = nameTool( toolname, parent );
290 
291  // Find tool in list of those already existing, and tell its
292  // interface that it has been used one more time
294  [&]( const IAlgTool* i ) { return i->name() == fullname && i->parent() == parent; } );
295  if ( it != std::end( m_instancesTools ) ) {
296  ON_DEBUG debug() << "Retrieved tool " << toolname << " with parent " << parent << endmsg;
297  itool = *it;
298  }
299 
300  if ( !itool ) {
301  // Instances of this tool do not exist, create an instance if desired
302  // otherwise return failure
303  if ( UNLIKELY( !createIf ) ) {
304  warning() << "Tool " << toolname << " not found and creation not requested" << endmsg;
305  return sc;
306  }
307  sc = create( std::string{tooltype}, std::string{toolname}, parent, itool );
308  if ( sc.isFailure() ) { return sc; }
309  }
310 
311  // Get the right interface of it
312  sc = itool->queryInterface( iid, pp_cast<void>( &tool ) );
313  if ( UNLIKELY( sc.isFailure() ) ) {
314  error() << "Tool " << toolname << " either does not implement the correct interface, or its version is incompatible"
315  << endmsg;
316  return sc;
317  }
318 
323  [&]( IToolSvc::Observer* obs ) { obs->onRetrieve( itool ); } );
324  return sc;
325 }
#define UNLIKELY(x)
Definition: Kernel.h:106
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
allow call-backs when a tool is a created or retrieved
Definition: IToolSvc.h:230
StatusCode create(const std::string &type, const IInterface *parent, IAlgTool *&tool)
Create Tool standard way with automatically assigned name.
Definition: ToolSvc.cpp:386
T end(T... args)
std::vector< IToolSvc::Observer * > m_observers
Definition: ToolSvc.h:106
virtual const std::string & name() const =0
Retrieve the name of the instance.
STL class.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:61
std::string nameTool(std::string_view nameByUser, const IInterface *parent)
Get Tool full name by combining nameByUser and "parent" part.
Definition: ToolSvc.cpp:575
T lock(T... args)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
virtual const IInterface * parent() const =0
The parent of the concrete AlgTool.
T find_if(T... args)
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
T begin(T... args)
virtual void onRetrieve(const IAlgTool *)
Definition: IToolSvc.h:238
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:33
#define ON_DEBUG
Definition: ToolSvc.cpp:31
constexpr static const auto FAILURE
Definition: StatusCode.h:101
const Gaudi::Algorithm & parent
CallMutex m_mut
Definition: ToolSvc.h:109
T for_each(T... args)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
StatusCode retrieve(std::string_view type, const InterfaceID &iid, IAlgTool *&tool, const IInterface *parent, bool createIf) override
Retrieve tool, create it by default as common tool if it does not already exist.
Definition: ToolSvc.cpp:239
virtual StatusCode queryInterface(const InterfaceID &ti, void **pp)=0
Set the void** to the pointer to the requested interface of the instance.

◆ start()

StatusCode ToolSvc::start ( )
override

Definition at line 664 of file ToolSvc.cpp.

666 {
667 
668  ON_DEBUG debug() << "START transition for AlgTools" << endmsg;
669 
670  bool fail( false );
671  for ( auto& iTool : m_instancesTools ) {
672  ON_VERBOSE verbose() << iTool->name() << "::start()" << endmsg;
673 
674  if ( UNLIKELY( !iTool->sysStart().isSuccess() ) ) {
675  fail = true;
676  error() << iTool->name() << " failed to start()" << endmsg;
677  }
678  }
679 
680  if ( UNLIKELY( fail ) ) {
681  error() << "One or more AlgTools failed to start()" << endmsg;
682  return StatusCode::FAILURE;
683  }
684  return StatusCode::SUCCESS;
685 }
#define UNLIKELY(x)
Definition: Kernel.h:106
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
#define ON_DEBUG
Definition: ToolSvc.cpp:31
constexpr static const auto FAILURE
Definition: StatusCode.h:101
#define ON_VERBOSE
Definition: ToolSvc.cpp:32
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ stop()

StatusCode ToolSvc::stop ( )
override

Definition at line 688 of file ToolSvc.cpp.

690 {
691 
692  ON_DEBUG debug() << "STOP transition for AlgTools" << endmsg;
693 
694  bool fail( false );
695  for ( auto& iTool : m_instancesTools ) {
696  ON_VERBOSE verbose() << iTool->name() << "::stop()" << endmsg;
697 
698  if ( UNLIKELY( !iTool->sysStop().isSuccess() ) ) {
699  fail = true;
700  error() << iTool->name() << " failed to stop()" << endmsg;
701  }
702  }
703 
704  if ( UNLIKELY( fail ) ) {
705  error() << "One or more AlgTools failed to stop()" << endmsg;
706  return StatusCode::FAILURE;
707  }
708  return StatusCode::SUCCESS;
709 }
#define UNLIKELY(x)
Definition: Kernel.h:106
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101
#define ON_DEBUG
Definition: ToolSvc.cpp:31
constexpr static const auto FAILURE
Definition: StatusCode.h:101
#define ON_VERBOSE
Definition: ToolSvc.cpp:32
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ totalToolRefCount()

unsigned long ToolSvc::totalToolRefCount ( ) const
private

The total number of refCounts on all tools in the instancesTools list.

Definition at line 634 of file ToolSvc.cpp.

636 {
637  return totalRefCount( m_instancesTools );
638 }
std::vector< IAlgTool * > m_instancesTools
Common Tools.
Definition: ToolSvc.h:101

Member Data Documentation

◆ m_instancesTools

std::vector<IAlgTool*> ToolSvc::m_instancesTools
private

Common Tools.

Definition at line 101 of file ToolSvc.h.

◆ m_mut

CallMutex ToolSvc::m_mut
mutableprivate

Definition at line 109 of file ToolSvc.h.

◆ m_observers

std::vector<IToolSvc::Observer*> ToolSvc::m_observers
private

Definition at line 106 of file ToolSvc.h.

◆ m_pHistorySvc

IHistorySvc* ToolSvc::m_pHistorySvc = nullptr
private

Pointer to HistorySvc.

Definition at line 104 of file ToolSvc.h.


The documentation for this class was generated from the following files: