Allow choice to trap or not program faults
[src/app-framework-binder.git] / src / sig-monitor.c
index e15c32d..15fe260 100644 (file)
@@ -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);
+}