43#include "SignalHandler.h"
48EventHandler *SignalHandler::d_signal_handlers[NSIG];
49Sigfunc *SignalHandler::d_old_handlers[NSIG];
50SignalHandler *SignalHandler::d_instance = 0;
54static pthread_once_t instance_control = PTHREAD_ONCE_INIT;
58SignalHandler::initialize_instance()
61 SignalHandler::d_instance =
new SignalHandler;
62 atexit(SignalHandler::delete_instance);
67SignalHandler::delete_instance()
69 if (SignalHandler::d_instance) {
70 for (
int i = 0; i < NSIG; ++i) {
75 d_signal_handlers[i] = 0;
76 d_old_handlers[i] = 0;
79 delete SignalHandler::d_instance;
80 SignalHandler::d_instance = 0;
91SignalHandler::dispatcher(
int signum)
94 if (SignalHandler::d_signal_handlers[signum] != 0)
96 SignalHandler::d_signal_handlers[signum]->handle_signal(signum);
98 Sigfunc *old_handler = SignalHandler::d_old_handlers[signum];
99 if (old_handler == SIG_IGN || old_handler == SIG_ERR)
101 else if (old_handler == SIG_DFL) {
113 case SIGTERM: _exit(EXIT_FAILURE);
122 throw Error(internal_error,
"Signal handler operation on an unsupported signal.");
133 pthread_once(&instance_control, initialize_instance);
167 string(
"Call to register_handler with unsupported signal (")
168 + long_to_string(signum) +
string(
")."));
172 EventHandler *old_eh = SignalHandler::d_signal_handlers[signum];
174 SignalHandler::d_signal_handlers[signum] = eh;
180 sa.sa_handler = dispatcher;
181 sigemptyset(&sa.sa_mask);
187 if (signum == SIGALRM) {
189 sa.sa_flags |= SA_INTERUPT;
194 sa.sa_flags |= SA_RESTART;
198 struct sigaction osa;
200 if (sigaction(signum, &sa, &osa) < 0)
201 throw InternalErr(__FILE__, __LINE__,
"Could not register a signal handler.");
207 if (ignore_by_default)
208 SignalHandler::d_old_handlers[signum] = SIG_IGN;
209 else if (osa.sa_handler != dispatcher)
210 SignalHandler::d_old_handlers[signum] = osa.sa_handler;
222 EventHandler *old_eh = SignalHandler::d_signal_handlers[signum];
224 SignalHandler::d_signal_handlers[signum] = 0;
A class for software fault reporting.
EventHandler * register_handler(int signum, EventHandler *eh, bool ignore_by_default=false)
static SignalHandler * instance()
EventHandler * remove_handler(int signum)
top level DAP object to house generic methods