X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=sidebyside;f=src%2Fevent.c;h=5a131b64875bb7e2317b2e83fe40fb427b387fe6;hb=546eb066092803d218c5b31d32af724c42bee2a1;hp=b6def622023e0ade5f513af787225f1fba0c37f2;hpb=77c25aa7e676e4eb8c099940ca8c4b872b64415c;p=meshlink diff --git a/src/event.c b/src/event.c index b6def622..5a131b64 100644 --- a/src/event.c +++ b/src/event.c @@ -177,7 +177,12 @@ void signal_del(event_loop_t *loop, signal_t *sig) { sig->cb = NULL; } -bool event_loop_run(event_loop_t *loop) { +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) { loop->running = true; fd_set readable; @@ -185,7 +190,7 @@ bool event_loop_run(event_loop_t *loop) { 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,6 +206,12 @@ bool event_loop_run(event_loop_t *loop) { } } + 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); @@ -211,7 +222,12 @@ bool event_loop_run(event_loop_t *loop) { fds = last->fd + 1; } + // release mesh mutex during select + if(mutex) + pthread_mutex_unlock(mutex); int n = select(fds, &readable, &writable, NULL, tv); + if(mutex) + pthread_mutex_lock(mutex); if(n < 0) { if(sockwouldblock(errno))