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;
353 "List of signal names or numbers to use to schedule a stop. "
354 "If the signal is followed by a '+' the signal is propagated the previously "
355 "registered handler (if any).");
362 std::string serviceName(
"Gaudi::Utils::SignalMonitorSvc");
365 error() <<
"Cannot retrieve " << serviceName <<
endmsg;
368 serviceName =
"IncidentSvc";
371 error() <<
"Cannot retrieve " << serviceName <<
endmsg;
377 warning() <<
"Cannot retrieve IProperty interface of ApplicationMgr, "
378 "the return code will not be changed" <<
endmsg;
385 if (sigid.
first >= 0) {
390 const SigMap& sigmap(SigMap::instance());
393 debug() <<
"\t" << sigmap.name(
s->first) <<
": "
394 << sigmap.desc(
s->first) <<
" (" <<
s->first <<
")";
395 if (
s->second)
debug() <<
" propagated";
401 debug() <<
"Register to the IncidentSvc" <<
endmsg;
420 const SigMap& sigmap(SigMap::instance());
424 warning() <<
"Received signal '" << sigmap.name(
s->first)
425 <<
"' (" <<
s->first;
427 if ( ! desc.empty() ) {
435 error() <<
"Could not set return code of the application ("
445 ep->stopRun().ignore();
448 warning() <<
"Cannot stop the processing because the IEventProcessor interface cannot be retrieved." <<
endmsg;
468 debug() <<
"Decoding signal declaration '" << sig <<
"'" <<
endmsg;
469 if ( sig.empty() || sig ==
"+" ) {
471 return std::make_pair<int, bool>(-1,
false);
473 const SigMap& sigmap(SigMap::instance());
475 bool propagate =
false;
477 if (signal[signal.size() - 1] ==
'+') {
478 debug() <<
"Must be propagated to previously registered signal handlers" <<
endmsg;
480 signal.erase(signal.size() - 1, 1);
489 signum = sigmap.signum(signal);
492 warning() <<
"Cannot understand signal identifier '" << sig <<
"', ignored" <<
endmsg;
494 verbose() <<
"Matched signal '" << sigmap.name(signum)
497 if ( ! desc.empty() ) {
516 typedef Gaudi::Utils::SignalMonitorSvc
g_u_sms;