From: Mathew Heard Date: Sun, 15 Aug 2021 05:46:04 +0000 (+1000) Subject: Simplify signal handling. X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=commitdiff_plain;h=290ca7a798604f33d30089477f0cddf7ba5eff9f Simplify signal handling. Use an array instead of a splay tree. --- diff --git a/src/event.c b/src/event.c index a1801723..226a4523 100644 --- a/src/event.c +++ b/src/event.c @@ -219,13 +219,16 @@ void timeout_del(timeout_t *timeout) { } #ifndef HAVE_MINGW -static int signal_compare(const signal_t *a, const signal_t *b) { - return a->signum - b->signum; -} + +// From Matz's Ruby +#ifndef NSIG +# define NSIG (_SIGMAX + 1) /* For QNX */ +#endif + static io_t signalio; static int pipefd[2] = {-1, -1}; -static splay_tree_t signal_tree = {.compare = (splay_compare_t)signal_compare}; +static signal_t *signal_handle[NSIG + 1] = {}; static void signal_handler(int signum) { unsigned char num = signum; @@ -241,9 +244,7 @@ static void signalio_handler(void *data, int flags) { return; } - signal_t *sig = splay_search(&signal_tree, &((signal_t) { - .signum = signum - })); + signal_t *sig = signal_handle[signum]; if(sig) { sig->cb(sig->data); @@ -261,20 +262,17 @@ void signal_add(signal_t *sig, signal_cb_t cb, void *data, int signum) { return; } + sig->signum = signum; sig->cb = cb; sig->data = data; - sig->signum = signum; - sig->node.data = sig; if(pipefd[0] == -1) { pipe_init(); } - signal(sig->signum, signal_handler); + signal(signum, signal_handler); - if(!splay_insert_node(&signal_tree, &sig->node)) { - abort(); - } + signal_handle[signum] = sig; } void signal_del(signal_t *sig) { @@ -284,7 +282,7 @@ void signal_del(signal_t *sig) { signal(sig->signum, SIG_DFL); - splay_unlink_node(&signal_tree, &sig->node); + signal_handle[sig->signum] = NULL; sig->cb = NULL; } #endif diff --git a/src/event.h b/src/event.h index 74224d40..d0f19118 100644 --- a/src/event.h +++ b/src/event.h @@ -52,7 +52,6 @@ typedef struct signal_t { int signum; signal_cb_t cb; void *data; - splay_node_t node; } signal_t; extern struct timeval now;