31 typedef struct sigaction handler_t;
41 sa = SignalMonitorSvc::dispatcher;
42 oldact = signal(signum, sa);
44 sa.sa_handler = SignalMonitorSvc::dispatcher;
45 sigemptyset(&sa.sa_mask);
47 sigaction(signum, &sa, &oldact);
50 m_monitored[signum] = (propagate) ? SignalMonitorSvc::propagate
51 : SignalMonitorSvc::trap;
93 for(
int i = 0;
i < NSIG; ++
i){
104 for (
int i = 0;
i < NSIG; ++
i) {
157 static void dispatcher(
int signum);
161 void SignalMonitorSvc::dispatcher(
int signum){
162 if (instance()) instance()->i_handle(signum);
182 const char *sig_desc(
int signum) {
183 if (signum >= NSIG || signum < 0)
187 case SIGINT:
return "Interrupt";
188 case SIGILL:
return "Illegal instruction";
189 case SIGFPE:
return "Floating point exception";
190 case SIGSEGV:
return "Segmentation fault";
191 case SIGTERM:
return "Terminated";
192 case SIGBREAK:
return "Trace/breakpoint trap";
193 case SIGABRT:
return "Aborted";
197 return sys_siglist[signum];
205 static const SigMap& instance() {
206 static SigMap _instance;
211 return m_num2id[signum];
215 return m_num2desc[signum];
220 it = m_name2num.
find(str);
221 if (it == m_name2num.
end()) {
230 #define addSignal(id) i_addSignal(id, #id);
319 inline void i_addSignal(
int signum,
const char *signame) {
320 m_num2id[signum] = signame;
321 m_name2num[signame] = signum;
322 const char* desc = sig_desc(signum);
324 m_num2desc[signum] = desc;
325 m_name2num[desc] = signum;
352 "List of signal names or numbers to use to schedule a stop. "
353 "If the signal is followed by a '+' the signal is propagated the previously "
354 "registered handler (if any).");
361 std::string serviceName(
"Gaudi::Utils::SignalMonitorSvc");
364 error() <<
"Cannot retrieve " << serviceName <<
endmsg;
367 serviceName =
"IncidentSvc";
370 error() <<
"Cannot retrieve " << serviceName <<
endmsg;
376 warning() <<
"Cannot retrieve IProperty interface of ApplicationMgr, "
377 "the return code will not be changed" <<
endmsg;
384 if (sigid.
first >= 0) {
389 const SigMap& sigmap(SigMap::instance());
392 debug() <<
"\t" << sigmap.name(
s->first) <<
": "
393 << sigmap.desc(
s->first) <<
" (" <<
s->first <<
")";
394 if (
s->second)
debug() <<
" propagated";
400 debug() <<
"Register to the IncidentSvc" <<
endmsg;
419 const SigMap& sigmap(SigMap::instance());
423 warning() <<
"Received signal '" << sigmap.name(
s->first)
424 <<
"' (" <<
s->first;
426 if ( ! desc.empty() ) {
434 error() <<
"Could not set return code of the application ("
444 ep->stopRun().ignore();
447 warning() <<
"Cannot stop the processing because the IEventProcessor interface cannot be retrieved." <<
endmsg;
467 debug() <<
"Decoding signal declaration '" << sig <<
"'" <<
endmsg;
468 if ( sig.empty() || sig ==
"+" ) {
470 return std::make_pair<int, bool>(-1,
false);
472 const SigMap& sigmap(SigMap::instance());
474 bool propagate =
false;
476 if (signal[signal.size() - 1] ==
'+') {
477 debug() <<
"Must be propagated to previously registered signal handlers" <<
endmsg;
479 signal.erase(signal.size() - 1, 1);
488 signum = sigmap.signum(signal);
491 warning() <<
"Cannot understand signal identifier '" << sig <<
"', ignored" <<
endmsg;
493 verbose() <<
"Matched signal '" << sigmap.name(signum)
496 if ( ! desc.empty() ) {
515 typedef Gaudi::Utils::SignalMonitorSvc
g_u_sms;