]> git.meshlink.io Git - meshlink/blobdiff - src/event.c
Send out channel data immediately, bypassing the packet queue.
[meshlink] / src / event.c
index 90f56944fec9cc2a2251d2066630f736cccaac57..11f1ed817003138cf4b2a7e4a3b7e45f341e8a12 100644 (file)
@@ -71,7 +71,9 @@ void io_add(event_loop_t *loop, io_t *io, io_cb_t cb, void *data, int fd, int fl
 
        io_set(loop, io, flags);
 
-       assert(splay_insert_node(&loop->ios, &io->node));
+       splay_node_t *node = splay_insert_node(&loop->ios, &io->node);
+       assert(node);
+       (void)node;
 }
 
 void io_set(event_loop_t *loop, io_t *io, int flags) {
@@ -164,18 +166,23 @@ static void signalio_handler(event_loop_t *loop, void *data, int flags) {
                return;
        }
 
-       signal_t *sig = splay_search(&loop->signals, &((signal_t) {
+       signal_t *sig = splay_search(&loop->signals, &(signal_t) {
                .signum = signum
-       }));
+       });
 
        if(sig) {
+               sig->set = false;
                sig->cb(loop, sig->data);
        }
 }
 
 static void pipe_init(event_loop_t *loop) {
-       assert(pipe(loop->pipefd) == 0);
-       io_add(loop, &loop->signalio, signalio_handler, NULL, loop->pipefd[0], IO_READ);
+       int result = pipe(loop->pipefd);
+       assert(result == 0);
+
+       if(result == 0) {
+               io_add(loop, &loop->signalio, signalio_handler, NULL, loop->pipefd[0], IO_READ);
+       }
 }
 
 static void pipe_exit(event_loop_t *loop) {
@@ -189,7 +196,12 @@ static void pipe_exit(event_loop_t *loop) {
 }
 
 void signal_trigger(event_loop_t *loop, signal_t *sig) {
+       if(sig->set) {
+               return;
+       }
+
        uint8_t signum = sig->signum;
+       sig->set = true;
        write(loop->pipefd[1], &signum, 1);
        return;
 }
@@ -200,6 +212,7 @@ void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, u
        sig->cb = cb;
        sig->data = data;
        sig->signum = signum;
+       sig->set = false;
        sig->node.data = sig;
 
        if(loop->pipefd[0] == -1) {