X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fevent.c;h=6ca44d4898aa8d8110d728a2316a89d44fc39505;hb=185a8731839551fc9df7059ac374be5f5e35c086;hp=62daea6f13cf3a6138116e67773c1c60502bd22a;hpb=a387ef3cd807b90bbdf39581b6aea1bce9573f19;p=meshlink diff --git a/src/event.c b/src/event.c index 62daea6f..6ca44d48 100644 --- a/src/event.c +++ b/src/event.c @@ -91,7 +91,9 @@ 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 timeval *tv) { if(!timeout->cb) - timeout->tv = (struct timeval){0, 0}; + timeout->tv = (struct timeval) { + 0, 0 + }; timeout->cb = cb; timeout->data = data; @@ -121,7 +123,9 @@ void timeout_del(event_loop_t *loop, timeout_t *timeout) { splay_unlink_node(&loop->timeouts, &timeout->node); timeout->cb = 0; - timeout->tv = (struct timeval){0, 0}; + timeout->tv = (struct timeval) { + 0, 0 + }; } static int signal_compare(const signal_t *a, const signal_t *b) { @@ -133,7 +137,9 @@ static void signalio_handler(event_loop_t *loop, void *data, int flags) { if(read(loop->pipefd[0], &signum, 1) != 1) return; - signal_t *sig = splay_search(&loop->signals, &((signal_t){.signum = signum})); + signal_t *sig = splay_search(&loop->signals, &((signal_t) { + .signum = signum + })); if(sig) sig->cb(loop, sig->data); } @@ -177,15 +183,18 @@ void signal_del(event_loop_t *loop, signal_t *sig) { sig->cb = NULL; } -bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) { - loop->running = true; +void idle_set(event_loop_t *loop, idle_cb_t cb, void *data) { + loop->idle_cb = cb; + loop->idle_data = data; +} +bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) { fd_set readable; fd_set writable; while(loop->running) { gettimeofday(&loop->now, NULL); - struct timeval diff, *tv = NULL; + struct timeval diff, it, *tv = NULL; while(loop->timeouts.head) { timeout_t *timeout = loop->timeouts.head->data; @@ -201,8 +210,14 @@ bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) { } } - memcpy(&readable, &loop->readfds, sizeof readable); - memcpy(&writable, &loop->writefds, sizeof writable); + if(loop->idle_cb) { + it = loop->idle_cb(loop, loop->idle_data); + if(it.tv_sec >= 0 && (!tv || timercmp(&it, tv, <))) + tv = ⁢ + } + + memcpy(&readable, &loop->readfds, sizeof(readable)); + memcpy(&writable, &loop->writefds, sizeof(writable)); int fds = 0; @@ -255,6 +270,10 @@ void event_flush_output(event_loop_t *loop) { io->cb(loop, io->data, IO_WRITE); } +void event_loop_start(event_loop_t *loop) { + loop->running = true; +} + void event_loop_stop(event_loop_t *loop) { loop->running = false; }