summaryrefslogtreecommitdiffstats
path: root/src/sig-monitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sig-monitor.c')
-rw-r--r--src/sig-monitor.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/src/sig-monitor.c b/src/sig-monitor.c
index e15c32de..15fe260d 100644
--- a/src/sig-monitor.c
+++ b/src/sig-monitor.c
@@ -44,6 +44,7 @@ static _Thread_local timer_t thread_timerid;
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
@@ -236,9 +237,25 @@ static void on_signal_error(int signum)
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()
@@ -251,7 +268,7 @@ void sig_monitor_clean_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;
@@ -260,17 +277,25 @@ void sig_monitor(int timeout, void (*function)(int sig, void*), void *arg)
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);
+}