}
#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;
return;
}
- signal_t *sig = splay_search(&signal_tree, &((signal_t) {
- .signum = signum
- }));
+ signal_t *sig = signal_handle[signum];
if(sig) {
sig->cb(sig->data);
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) {
signal(sig->signum, SIG_DFL);
- splay_unlink_node(&signal_tree, &sig->node);
+ signal_handle[sig->signum] = NULL;
sig->cb = NULL;
}
#endif