X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fsig-monitor.c;h=15fe260db6c06772395303203bc995a0dcf5f33b;hb=a02a1627a954432cc65ec981cada8ba420d7ad2f;hp=e15c32deb696d7746b53112f0fef813b2ffba94d;hpb=5dd7df31306b95a3fafe6d3238d4553107a6c70f;p=src%2Fapp-framework-binder.git 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); +}