41std::vector<EventHandler *> SignalHandler::d_signal_handlers{NSIG,
nullptr};
42std::vector<Sigfunc *> SignalHandler::d_old_handlers{NSIG,
nullptr};
53void SignalHandler::dispatcher(
int signum) {
55 if (d_signal_handlers[signum] !=
nullptr)
57 d_signal_handlers[signum]->handle_signal(signum);
59 Sigfunc *old_handler = SignalHandler::d_old_handlers[signum];
60 if (old_handler == SIG_IGN || old_handler == SIG_ERR)
62 else if (old_handler == SIG_DFL)
63 throw Error(
internal_error,
"Signal handler operation on an unsupported signal.");
103 string(
"Call to register_handler with unsupported signal (") +
long_to_string(signum) +
108 EventHandler *old_eh = SignalHandler::d_signal_handlers[signum];
110 SignalHandler::d_signal_handlers[signum] = eh;
115 struct sigaction sa {};
116 sa.sa_handler = dispatcher;
117 sigemptyset(&sa.sa_mask);
123 if (signum == SIGALRM) {
125 sa.sa_flags |= SA_INTERUPT;
129 sa.sa_flags |= SA_RESTART;
133 struct sigaction old_sa {};
135 if (sigaction(signum, &sa, &old_sa) < 0)
136 throw InternalErr(__FILE__, __LINE__,
"Could not register a signal handler.");
142 if (ignore_by_default)
143 SignalHandler::d_old_handlers[signum] = SIG_IGN;
144 else if (old_sa.sa_handler != &dispatcher)
145 SignalHandler::d_old_handlers[signum] = old_sa.sa_handler;
155 EventHandler *old_eh = SignalHandler::d_signal_handlers[signum];
157 SignalHandler::d_signal_handlers[signum] =
nullptr;
#define internal_error
Internal server error (500)
A class for software fault reporting.
static EventHandler * register_handler(int signum, EventHandler *eh, bool ignore_by_default=false)
static SignalHandler * instance()
static EventHandler * remove_handler(int signum)
top level DAP object to house generic methods
string long_to_string(long val, int base)