static int sigerr[] = { SIG_FOR_TIMER, SIGSEGV, SIGFPE, SIGILL, SIGBUS, 0 };
static int sigterm[] = { SIGINT, SIGABRT, SIGTERM, 0 };
static int exiting = 0;
+static int enabled = 0;
/*
* Dumps the current stack
safe_exit(2);
}
-int sig_monitor_init()
+void sig_monitor_disable()
{
- return (install(on_signal_error, sigerr) & install(on_signal_terminate, sigterm)) - 1;
+ enabled = 0;
+ install(SIG_DFL, sigerr);
+ install(SIG_DFL, sigterm);
+}
+
+int sig_monitor_enable()
+{
+ enabled = install(on_signal_error, sigerr) && install(on_signal_terminate, sigterm);
+ if (enabled)
+ return 0;
+ sig_monitor_disable();
+ return -1;
+}
+
+int sig_monitor_init(int enable)
+{
+ return enable ? sig_monitor_enable() : (sig_monitor_disable(), 0);
}
int sig_monitor_init_timeouts()
timeout_delete();
}
-void sig_monitor(int timeout, void (*function)(int sig, void*), void *arg)
+static void monitor(int timeout, void (*function)(int sig, void*), void *arg)
{
volatile int signum, signum2;
sigjmp_buf jmpbuf, *older;
signum = setjmp(jmpbuf);
if (signum == 0) {
error_handler = &jmpbuf;
- if (timeout)
+ if (timeout) {
+ timeout_create();
timeout_arm(timeout);
+ }
function(0, arg);
} else {
signum2 = setjmp(jmpbuf);
if (signum2 == 0)
function(signum, arg);
}
- error_handler = older;
if (timeout)
timeout_disarm();
+ error_handler = older;
}
+void sig_monitor(int timeout, void (*function)(int sig, void*), void *arg)
+{
+ if (enabled)
+ monitor(timeout, function, arg);
+ else
+ function(0, arg);
+}
+void sig_monitor_dumpstack()
+{
+ return dumpstack(1, 0);
+}