From fb5470d14488442686ffbf260a06a47892919c5c Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 14 Dec 2012 00:02:33 +0100 Subject: [PATCH] OPTIM: epoll: current fd does not count as a new one The epoll loop checks for newly appeared FDs in order to process them early if they're accepted sockets. Since the introduction of the fd_ev_set() calls before the iocb(), the current FD is always in the update list, and we don't want to check it again, so we must assign the old_updt index just before calling the I/O handler. --- src/ev_epoll.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ev_epoll.c b/src/ev_epoll.c index b858e18ae6..5f7b7c3d7b 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -167,7 +167,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) fdtab[fd].ev |= n; if (fdtab[fd].iocb) { - int new_updt, old_updt = fd_nbupdt; /* Save number of updates to detect creation of new FDs. */ + int new_updt, old_updt; /* Mark the events as speculative before processing * them so that if nothing can be done we don't need @@ -179,6 +179,8 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) if (fdtab[fd].ev & FD_POLL_OUT) fd_ev_set(fd, DIR_WR); + /* Save number of updates to detect creation of new FDs. */ + old_updt = fd_nbupdt; fdtab[fd].iocb(fd); /* One or more fd might have been created during the iocb(). -- 2.47.3