- for splay_each(io_t, io, &io_tree) {
- if(FD_ISSET(io->fd, &writable))
- io->cb(io->data, IO_WRITE);
- else if(FD_ISSET(io->fd, &readable))
- io->cb(io->data, IO_READ);
+ // Normally, splay_each allows the current node to be deleted. However,
+ // it can be that one io callback triggers the deletion of another io,
+ // so we have to detect this and break the loop.
+
+ loop->deletion = false;
+
+ for splay_each(io_t, io, &loop->ios) {
+ if(FD_ISSET(io->fd, &writable) && io->cb)
+ io->cb(loop, io->data, IO_WRITE);
+ if(loop->deletion)
+ break;
+ if(FD_ISSET(io->fd, &readable) && io->cb)
+ io->cb(loop, io->data, IO_READ);
+ if(loop->deletion)
+ break;