X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fevent.c;h=43e4e0401d941601b0ffc3818720655a0edc505c;hb=ce76e2051ce668ff4623263215bf4b38cfca46ca;hp=739ff35de5a595b76fee4f56ed43ca42b31e9e4c;hpb=4c57e6902219ecca1872e18e34365d8e54a0f407;p=meshlink diff --git a/src/event.c b/src/event.c index 739ff35d..43e4e040 100644 --- a/src/event.c +++ b/src/event.c @@ -64,10 +64,6 @@ static void timespec_clear(struct timespec *a) { a->tv_sec = 0; } -static bool timespec_isset(const struct timespec *a) { - return a->tv_sec; -} - static int io_compare(const io_t *a, const io_t *b) { return a->fd - b->fd; } @@ -137,7 +133,6 @@ void io_del(event_loop_t *loop, io_t *io) { void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void *data, struct timespec *tv) { timeout->cb = cb; timeout->data = data; - timeout->node.data = timeout; timeout_set(loop, timeout, tv); } @@ -145,8 +140,10 @@ void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void * void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timespec *tv) { assert(timeout->cb); - if(timespec_isset(&timeout->tv)) { + if(timeout->node.data) { splay_unlink_node(&loop->timeouts, &timeout->node); + } else { + timeout->node.data = timeout; } if(!loop->now.tv_sec) { @@ -163,7 +160,11 @@ void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timespec *tv) { } static void timeout_disable(event_loop_t *loop, timeout_t *timeout) { - splay_unlink_node(&loop->timeouts, &timeout->node); + if(timeout->node.data) { + splay_unlink_node(&loop->timeouts, &timeout->node); + timeout->node.data = NULL; + } + timespec_clear(&timeout->tv); } @@ -172,7 +173,7 @@ void timeout_del(event_loop_t *loop, timeout_t *timeout) { return; } - if(timespec_isset(&timeout->tv)) { + if(timeout->node.data) { timeout_disable(loop, timeout); } @@ -198,7 +199,7 @@ static void signalio_handler(event_loop_t *loop, void *data, int flags) { }); if(sig) { - sig->set = false; + atomic_flag_clear(&sig->set); sig->cb(loop, sig->data); } } @@ -223,12 +224,11 @@ static void pipe_exit(event_loop_t *loop) { } void signal_trigger(event_loop_t *loop, signal_t *sig) { - if(sig->set) { + if(atomic_flag_test_and_set(&sig->set)) { return; } uint8_t signum = sig->signum; - sig->set = true; write(loop->pipefd[1], &signum, 1); return; } @@ -239,9 +239,10 @@ 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; + atomic_flag_clear(&sig->set); + if(loop->pipefd[0] == -1) { pipe_init(loop); } @@ -310,7 +311,7 @@ bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) { } // release mesh mutex during select - pthread_mutex_unlock(mutex); + assert(pthread_mutex_unlock(mutex) == 0); #ifdef HAVE_PSELECT int n = pselect(fds, &readable, &writable, NULL, &ts, NULL); @@ -319,7 +320,7 @@ bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) { int n = select(fds, &readable, &writable, NULL, (struct timeval *)&tv); #endif - pthread_mutex_lock(mutex); + assert(pthread_mutex_lock(mutex) == 0); clock_gettime(EVENT_CLOCK, &loop->now); @@ -363,13 +364,6 @@ bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) { return true; } -void event_flush_output(event_loop_t *loop) { - for splay_each(io_t, io, &loop->ios) - if(FD_ISSET(io->fd, &loop->writefds)) { - io->cb(loop, io->data, IO_WRITE); - } -} - void event_loop_start(event_loop_t *loop) { loop->running = true; } @@ -393,14 +387,14 @@ void event_loop_exit(event_loop_t *loop) { assert(!loop->signals.count); for splay_each(io_t, io, &loop->ios) { - splay_unlink_node(&loop->ios, node); + splay_unlink_node(&loop->ios, splay_node); } for splay_each(timeout_t, timeout, &loop->timeouts) { - splay_unlink_node(&loop->timeouts, node); + splay_unlink_node(&loop->timeouts, splay_node); } for splay_each(signal_t, signal, &loop->signals) { - splay_unlink_node(&loop->signals, node); + splay_unlink_node(&loop->signals, splay_node); } }