aboutsummaryrefslogtreecommitdiff
path: root/src/util/timeout.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/timeout.c')
-rw-r--r--src/util/timeout.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/util/timeout.c b/src/util/timeout.c
index 51138fd..c9e20e0 100644
--- a/src/util/timeout.c
+++ b/src/util/timeout.c
@@ -3,18 +3,26 @@
* Copyright (C) 2017 J08nY
*/
#include "timeout.h"
-#include <signal.h>
-__thread jmp_buf exception;
+__thread jmp_buf timeout_ptr;
+__thread bool timeout_in;
+__thread timer_t timeout_timer;
-void timeout_handle(int signum) { longjmp(exception, 1); }
+void timeout_handle(int signum, siginfo_t *siginfo, void *other) {
+ sigset_t mask;
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGALRM);
+ sigprocmask(SIG_UNBLOCK, &mask, NULL);
+
+ if (timeout_in) siglongjmp(timeout_ptr, 1);
+}
bool timeout_init(const config_t *cfg) {
struct sigaction new_action;
- new_action.sa_handler = timeout_handle;
+ new_action.sa_sigaction = timeout_handle;
sigemptyset(&new_action.sa_mask);
- new_action.sa_flags = 0;
+ new_action.sa_flags = SA_SIGINFO;
sigaction(SIGALRM, &new_action, NULL);
return true;