37 return iNamed ? iNamed->name() : s_unknown;
42 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) ) 43 #define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) ) 45 #define DEBMSG ON_DEBUG debug() 46 #define VERMSG ON_VERBOSE verbose() 83 std::for_each( fi.second.unsafe_begin(), fi.second.unsafe_end(), [](
auto i ) {
delete i; } );
86 m_firedIncidents.clear();
112 auto& llist = *itMap->second;
119 DEBMSG <<
"Adding [" << type <<
"] listener '" << getListenerName( lis ) <<
"' with priority " << prio <<
endmsg;
120 llist.emplace( i, lis, prio, rethrow, singleShot );
126 auto match = [&]( ListenerList::const_reference j ) {
return !item || item == j.iListener; };
128 auto&
c = *( i->second );
129 if ( !scheduleRemoval ) {
132 debug() <<
"Removing [" << i->first <<
"] listener '" << getListenerName( j.iListener ) <<
"'" <<
endmsg;
148 if ( type.empty() ) {
162 constexpr
struct isSingleShot_t {
177 if ( incident.
type() == IncidentType::FailInputFile || incident.
type() == IncidentType::CorruptedInputFile ) {
192 bool firedSingleShot =
false;
194 auto& listeners = *ilisteners->second;
196 for (
auto& listener : listeners ) {
198 VERMSG <<
"Calling '" << getListenerName( listener.iListener ) <<
"' for incident [" << incident.
type() <<
"]" 203 listener.iListener->handle( incident );
205 error() <<
"Exception with tag=" << exc.
tag() <<
" is caught" 206 " handling incident " 209 if ( listener.rethrow ) {
213 error() <<
"Standard std::exception is caught" 214 " handling incident " 217 if ( listener.rethrow ) {
221 error() <<
"UNKNOWN Exception is caught" 222 " handling incident " 224 if ( listener.rethrow ) {
229 firedSingleShot |= listener.singleShot;
231 if ( firedSingleShot ) {
249 if ( incident.
type() !=
"ALL" ) {
258 auto ctx = incident->
context();
260 res.first->second.push( incident.
release() );
274 l.
reserve( i->second->size() );
276 [](
const Listener& j ) { return j.iListener; } );
290 DEBMSG <<
"Collecting listeners fired on context " << *ctx <<
endmsg;
291 while ( incs->second.try_pop( inc ) ) {
StatusCode initialize() override
ChronoEntity m_timer
timer & it's lock
Define general base for Gaudi exception.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
const std::string & type() const
Access to the incident type.
StatusCode finalize() override
StatusCode finalize() override
T partition_point(T...args)
void addListener(IIncidentListener *lis, const std::string &type="", long priority=0, bool rethrow=false, bool singleShot=false) override
IIncidentSvc::IncidentPack getIncidents(const EventContext *ctx) override
ListenerMap::iterator removeListenerFromList(ListenerMap::iterator, IIncidentListener *item, bool scheduleRemoval)
This class represents an entry point to all the event specific data.
IncidentSvc(const std::string &name, ISvcLocator *svc)
constexpr int CorruptedInput
std::vector< std::unique_ptr< Incident > > incidents
#define DECLARE_COMPONENT(type)
std::pair< iterator, bool > insert(ValueType &&val)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
The interface implemented by any class wanting to listen to Incidents.
std::recursive_mutex m_listenerMapMutex
Mutex to synchronize access to m_listenerMap.
This class is used for returning status codes from appropriate routines.
void removeListener(IIncidentListener *l, const std::string &type="") override
iterator find(const key_type &key)
virtual const std::string & tag() const
name tag for the exception, or exception type
StatusCode initialize() override
std::vector< std::vector< IIncidentListener * > > listeners
const std::string * m_currentIncidentType
Incident being fired.
StatusCode setAppReturnCode(SmartIF< IProperty > &appmgr, int value, bool force=false)
Set the application return code.
StatusCode setProperties()
Method for setting declared properties to the values specified for the job.
tbb::concurrent_queue< Incident * > IncQueue_t
tbb::concurrent_unordered_map< EventContext, IncQueue_t, EventContextHash, EventContextHash > m_firedIncidents
std::string outputUserTime() const
print the chrono ;
void getListeners(std::vector< IIncidentListener * > &lis, const std::string &type="") const override
map_type::iterator iterator
Helper object, useful for measurement of CPU-performance of highly-recursive structures, e.g.
virtual Out operator()(const vector_of_const_< In > &inputs) const =0
iterator erase(const_iterator pos)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
void i_fireIncident(const Incident &incident, const std::string &type)
Internal function to allow incidents listening to all events.
T back_inserter(T...args)
Base class for all Incidents (computing events).
void fireIncident(const Incident &incident) override
ListenerMap m_listenerMap
List of auditor names.
Default implementation of the IIncidentSvc interface.
The IProperty is the basic interface for all components which have properties that can be set or get...
EventContext context() const
Access to the EventContext of the source of the incident.
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.