From a742ea4d040ecfaabbc875c63f2625654ce68923 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Wed, 28 Feb 2018 21:28:16 +0100 Subject: [PATCH] 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. --- src/event.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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; + } } } -- 2.20.1