The Gaudi Framework  v30r3 (a5ef0a68)
IncidentProcAlg.cpp
Go to the documentation of this file.
1 #include "IncidentProcAlg.h"
4 #include "GaudiKernel/Incident.h"
7 
8 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) )
9 #define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) )
10 
11 #define DEBMSG ON_DEBUG debug()
12 #define VERMSG ON_VERBOSE verbose()
13 
14 namespace
15 {
16  // ==========================================================================
17  static const std::string s_unknown = "<unknown>";
18  // Helper to get the name of the listener
19  inline const std::string& getListenerName( IIncidentListener* lis )
20  {
21  SmartIF<INamedInterface> iNamed( lis );
22  return iNamed ? iNamed->name() : s_unknown;
23  }
24  // ==========================================================================
25 }
26 
27 IncidentProcAlg::IncidentProcAlg( const std::string& name, ISvcLocator* pSvcLocator ) : Algorithm( name, pSvcLocator )
28 {
29 }
30 
32 {
34  if ( sc.isFailure() ) return sc;
35  m_incSvc = service( "IncidentSvc", true );
36  return StatusCode::SUCCESS;
37 }
38 
39 //=============================================================================
41 {
42  const EventContext& context = Gaudi::Hive::currentContext();
43  auto incPack = m_incSvc->getIncidents( &context );
44  MsgStream log( msgSvc(), name() );
45  log << MSG::DEBUG << " Number of Incidents to process = " << incPack.incidents.size()
46  << " Context= " << Gaudi::Hive::currentContext() << endmsg;
47  while ( incPack.incidents.size() ) {
48  if ( incPack.incidents.size() != incPack.listeners.size() ) {
49  log << MSG::WARNING << " Size of fired incidents and listeners do not match!" << endmsg;
50  }
51  for ( size_t t = 0; t < incPack.incidents.size(); t++ ) {
52  auto& inc = incPack.incidents.at( t );
53  auto& lis = incPack.listeners.at( t );
54  for ( auto& l : lis ) {
55  log << MSG::DEBUG << "Calling '" << getListenerName( l ) << "' for incident [" << inc->type() << "]" << endmsg;
56 
57  // handle exceptions if they occur
58  try {
59  l->handle( *inc );
60  } catch ( const GaudiException& exc ) {
61  error() << "Exception with tag=" << exc.tag() << " is caught"
62  " handling incident"
63  << inc->type() << endmsg;
64  error() << exc << endmsg;
65  } catch ( const std::exception& exc ) {
66  error() << "Standard std::exception is caught"
67  " handling incident"
68  << inc->type() << endmsg;
69  error() << exc.what() << endmsg;
70  } catch ( ... ) {
71  error() << "UNKNOWN Exception is caught handling incident" << inc->type() << endmsg;
72  }
73  // check wheter one of the listeners is singleShot
74  }
75  }
76  incPack = m_incSvc->getIncidents( &context );
77  }
78 
79  return StatusCode::SUCCESS;
80 }
81 
82 //=============================================================================
84 {
85  info() << "Finalize" << endmsg;
86  return Algorithm::finalize();
87 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
Define general base for Gaudi exception.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:25
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:765
virtual IIncidentSvc::IncidentPack getIncidents(const EventContext *ctx)=0
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
StatusCode finalize() override
the default (empty) implementation of IStateful::finalize() method
Definition: Algorithm.h:185
This class represents an entry point to all the event specific data.
Definition: EventContext.h:24
bool isFailure() const
Definition: StatusCode.h:139
StatusCode initialize() override
StatusCode finalize() override
STL class.
#define DECLARE_COMPONENT(type)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
The interface implemented by any class wanting to listen to Incidents.
T what(T...args)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
IncidentProcAlg(const std::string &name, ISvcLocator *pSvcLocator)
Constructor(s)
SmartIF< IIncidentSvc > m_incSvc
GAUDI_API const EventContext & currentContext()
virtual const std::string & tag() const
name tag for the exception, or exception type
const SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
StatusCode execute() override
STL class.
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
dictionary l
Definition: gaudirun.py:440
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:78
StatusCode initialize() override
the default (empty) implementation of IStateful::initialize() method
Definition: Algorithm.h:179
StatusCode service(const std::string &name, T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn&#39;t already exist.
Definition: Algorithm.h:231
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
virtual const std::string & name() const =0
Retrieve the name of the instance.