35 {
"$Id: SignalHandler.cc 22703 2010-05-11 18:10:01Z 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) {
116 case SIGTERM: _exit(EXIT_FAILURE);
131 pthread_once(&instance_control, initialize_instance);
165 string(
"Call to register_handler with unsupported signal (")
170 EventHandler *old_eh = SignalHandler::d_signal_handlers[signum];
172 SignalHandler::d_signal_handlers[signum] = eh;
178 sa.sa_handler = dispatcher;
179 sigemptyset(&sa.sa_mask);
185 if (signum == SIGALRM) {
187 sa.sa_flags |= SA_INTERUPT;
192 sa.sa_flags |= SA_RESTART;
196 struct sigaction osa;
198 if (sigaction(signum, &sa, &osa) < 0)
199 throw InternalErr(__FILE__, __LINE__,
"Could not register a signal handler.");
206 SignalHandler::d_old_handlers[signum] = SIG_IGN;
207 else if (osa.sa_handler != dispatcher)
208 SignalHandler::d_old_handlers[signum] = osa.sa_handler;
220 EventHandler *old_eh = SignalHandler::d_signal_handlers[signum];
222 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)