From: Guus Sliepen Date: Wed, 28 Feb 2018 20:28:16 +0000 (+0100) Subject: Try to process all pending events after select(). X-Git-Tag: release-1.1pre16~14 X-Git-Url: https://git.tinc-vpn.org/git/browse?a=commitdiff_plain;h=a742ea4d040ecfaabbc875c63f2625654ce68923;p=tinc Try to process all pending events after select(). If we break out of the loop every time at the first filedescriptor that is read/writeable, we risk starving the other filedescriptors. --- diff --git a/src/event.c b/src/event.c index 9cd7d07a..8c7de479 100644 --- a/src/event.c +++ b/src/event.c @@ -348,6 +348,8 @@ bool event_loop(void) { continue; } + unsigned int curgen = io_tree.generation; + for splay_each(io_t, io, &io_tree) { if(FD_ISSET(io->fd, &writable)) { io->cb(io->data, IO_WRITE); @@ -360,10 +362,12 @@ bool event_loop(void) { /* There are scenarios in which the callback will remove another io_t from the tree (e.g. closing a double connection). Since splay_each does not support that, we - need to exit the loop now. That's okay, since any remaining events will get picked - up by the next select() call. + need to exit the loop if that happens. That's okay, since any remaining events will + get picked up by the next select() call. */ - break; + if(curgen != io_tree.generation) { + break; + } } }