From 290ca7a798604f33d30089477f0cddf7ba5eff9f Mon Sep 17 00:00:00 2001 From: Mathew Heard Date: Sun, 15 Aug 2021 15:46:04 +1000 Subject: [PATCH] Simplify signal handling. Use an array instead of a splay tree. --- src/event.c | 26 ++++++++++++-------------- src/event.h | 1 - 2 files changed, 12 insertions(+), 15 deletions(-) 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; -- 2.20.1