diff --git a/include/villas/utils.h b/include/villas/utils.h index 838cb73df..138426e47 100644 --- a/include/villas/utils.h +++ b/include/villas/utils.h @@ -241,8 +241,8 @@ static inline int log2i(long long x) { /** Sleep with rdtsc */ void rdtsc_sleep(uint64_t nanosecs, uint64_t start); -/** Register a exit callback for program termination (SIGINT / SIGKILL). */ -void signals_init(void (*cb)(int signal, siginfo_t *sinfo, void *ctx)); +/** Register a exit callback for program termination: SIGINT, SIGKILL & SIGALRM. */ +int signals_init(void (*cb)(int signal, siginfo_t *sinfo, void *ctx)); /** Send signal \p sig to main thread. */ void killme(int sig); diff --git a/lib/utils.c b/lib/utils.c index 16789dce0..111e979cc 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -299,8 +299,10 @@ void rdtsc_sleep(uint64_t nanosecs, uint64_t start) } /* Setup exit handler */ -void signals_init(void (*cb)(int signal, siginfo_t *sinfo, void *ctx)) +int signals_init(void (*cb)(int signal, siginfo_t *sinfo, void *ctx)) { + int ret; + info("Initialize signals"); struct sigaction sa_quit = { @@ -308,19 +310,32 @@ void signals_init(void (*cb)(int signal, siginfo_t *sinfo, void *ctx)) .sa_sigaction = cb }; - main_thread = pthread_self(); - - sigemptyset(&sa_quit.sa_mask); - sigaction(SIGINT, &sa_quit, NULL); - sigaction(SIGTERM, &sa_quit, NULL); - sigaction(SIGALRM, &sa_quit, NULL); - struct sigaction sa_chld = { .sa_flags = 0, .sa_handler = SIG_IGN }; + + main_thread = pthread_self(); - sigaction(SIGCHLD, &sa_chld, NULL); + sigemptyset(&sa_quit.sa_mask); + + ret = sigaction(SIGINT, &sa_quit, NULL); + if (ret) + return ret; + + ret = sigaction(SIGTERM, &sa_quit, NULL); + if (ret) + return ret; + + ret = sigaction(SIGALRM, &sa_quit, NULL); + if (ret) + return ret; + + ret = sigaction(SIGCHLD, &sa_chld, NULL); + if (ret) + return ret; + + return 0; } void killme(int sig)