35 {
"$Id: SignalHandler.cc 25112 2011-12-29 21:44:54Z jimg $"
52 EventHandler *SignalHandler::d_signal_handlers[NSIG];
53 Sigfunc *SignalHandler::d_old_handlers[NSIG];
54 SignalHandler *SignalHandler::d_instance = 0;
58 static pthread_once_t instance_control = PTHREAD_ONCE_INIT;
62 SignalHandler::initialize_instance()
65 SignalHandler::d_instance =
new SignalHandler;
66 atexit(SignalHandler::delete_instance);
71 SignalHandler::delete_instance()
73 if (SignalHandler::d_instance) {
74 for (
int i = 0; i < NSIG; ++i) {
79 d_signal_handlers[i] = 0;
80 d_old_handlers[i] = 0;
83 delete SignalHandler::d_instance;
84 SignalHandler::d_instance = 0;
95 SignalHandler::dispatcher(
int signum)
98 if (SignalHandler::d_signal_handlers[signum] != 0)
100 SignalHandler::d_signal_handlers[signum]->handle_signal(signum);
102 Sigfunc *old_handler = SignalHandler::d_old_handlers[signum];
103 if (old_handler == SIG_IGN || old_handler == SIG_ERR)
105 else if (old_handler == SIG_DFL) {
117 case SIGTERM: _exit(EXIT_FAILURE);
126 throw Error(
"Signal handler operation on an unsupported signal.");
137 pthread_once(&instance_control, initialize_instance);
171 string(
"Call to register_handler with unsupported signal (")
176 EventHandler *old_eh = SignalHandler::d_signal_handlers[signum];
178 SignalHandler::d_signal_handlers[signum] = eh;
184 sa.sa_handler = dispatcher;
185 sigemptyset(&sa.sa_mask);
191 if (signum == SIGALRM) {
193 sa.sa_flags |= SA_INTERUPT;
198 sa.sa_flags |= SA_RESTART;
202 struct sigaction osa;
204 if (sigaction(signum, &sa, &osa) < 0)
205 throw InternalErr(__FILE__, __LINE__,
"Could not register a signal handler.");
212 SignalHandler::d_old_handlers[signum] = SIG_IGN;
213 else if (osa.sa_handler != dispatcher)
214 SignalHandler::d_old_handlers[signum] = osa.sa_handler;
226 EventHandler *old_eh = SignalHandler::d_signal_handlers[signum];
228 SignalHandler::d_signal_handlers[signum] = 0;
static SignalHandler * instance()
A class for software fault reporting.
string long_to_string(long val, int base)
EventHandler * register_handler(int signum, EventHandler *eh, bool override=false)
EventHandler * remove_handler(int signum)