All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
IncidentProcAlg.cpp
Go to the documentation of this file.
3 #include "GaudiKernel/Incident.h"
4 #include "IncidentProcAlg.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 
28  ISvcLocator* pSvcLocator )
29  :Algorithm(name,pSvcLocator)
30 {
31 }
32 
35  if (sc.isFailure()) return sc;
36  m_incSvc = service("IncidentSvc",true);
37  return StatusCode::SUCCESS;
38 }
39 
40 
41 //=============================================================================
43  const EventContext& context = Gaudi::Hive::currentContext();
44  auto incPack=m_incSvc->getIncidents(&context);
45  MsgStream log(msgSvc(), name());
46  log<<MSG::DEBUG<<" Number of Incidents to process = "<<incPack.incidents.size()<<" 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)
56  << "' for incident [" << inc->type() << "]" << endmsg;
57 
58  // handle exceptions if they occur
59  try {
60  l->handle(*inc);
61  }
62  catch( const GaudiException& exc ) {
63  error() << "Exception with tag=" << exc.tag() << " is caught"
64  " handling incident" << inc->type() << endmsg;
65  error() << exc << endmsg;
66  }
67  catch( const std::exception& exc ) {
68  error() << "Standard std::exception is caught"
69  " handling incident" << inc->type() << endmsg;
70  error() << exc.what() << endmsg;
71  }
72  catch(...) {
73  error() << "UNKNOWN Exception is caught handling incident" << inc->type() << endmsg;
74  }
75  // check wheter one of the listeners is singleShot
76  }
77  }
78  incPack=m_incSvc->getIncidents(&context);
79  }
80 
81  return StatusCode::SUCCESS;
82 }
83 
84 //=============================================================================
86  info() << "Finalize" << endmsg;
87  return Algorithm::finalize();
88 }
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:715
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:184
This class represents an entry point to all the event specific data.
Definition: EventContext.h:25
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
StatusCode initialize() override
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:36
StatusCode finalize() override
STL class.
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:26
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
StatusCode execute() override
STL class.
dictionary l
Definition: gaudirun.py:421
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:178
SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
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:227
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
virtual const std::string & name() const =0
Retrieve the name of the instance.