diff --git a/src/ev_epoll.c b/src/ev_epoll.c index 5f7b7c3d7..90efaee05 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -179,6 +179,11 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) if (fdtab[fd].ev & FD_POLL_OUT) fd_ev_set(fd, DIR_WR); + if (fdtab[fd].spec_p) { + /* This fd was already scheduled for being called as a speculative I/O */ + continue; + } + /* Save number of updates to detect creation of new FDs. */ old_updt = fd_nbupdt; fdtab[fd].iocb(fd); diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c index 36a7b7f41..2142132e2 100644 --- a/src/ev_kqueue.c +++ b/src/ev_kqueue.c @@ -158,6 +158,13 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) if (fdtab[fd].ev & FD_POLL_OUT) fd_ev_set(fd, DIR_WR); + if (fdtab[fd].spec_p) { + /* This fd was already scheduled for being + * called as a speculative I/O. + */ + continue; + } + fdtab[fd].iocb(fd); } } diff --git a/src/ev_poll.c b/src/ev_poll.c index c09232e4b..e3ea4db63 100644 --- a/src/ev_poll.c +++ b/src/ev_poll.c @@ -181,6 +181,13 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) if (fdtab[fd].ev & FD_POLL_OUT) fd_ev_set(fd, DIR_WR); + if (fdtab[fd].spec_p) { + /* This fd was already scheduled for being + * called as a speculative I/O + */ + continue; + } + fdtab[fd].iocb(fd); } } diff --git a/src/ev_select.c b/src/ev_select.c index 48a62da18..dba5928c3 100644 --- a/src/ev_select.c +++ b/src/ev_select.c @@ -167,6 +167,13 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) if (fdtab[fd].ev & FD_POLL_OUT) fd_ev_set(fd, DIR_WR); + if (fdtab[fd].spec_p) { + /* This fd was already scheduled for being + * called as a speculative I/O. + */ + continue; + } + fdtab[fd].iocb(fd); } }