If we break out of the loop every time at the first filedescriptor that
is read/writeable, we risk starving the other filedescriptors.
+ 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);
for splay_each(io_t, io, &io_tree) {
if(FD_ISSET(io->fd, &writable)) {
io->cb(io->data, IO_WRITE);
/*
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
/*
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.
+ if(curgen != io_tree.generation) {
+ break;
+ }