From: Willy Tarreau Date: Thu, 13 Dec 2012 23:02:33 +0000 (+0100) Subject: OPTIM: epoll: current fd does not count as a new one X-Git-Tag: v1.5-dev16~35 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fb5470d14488442686ffbf260a06a47892919c5c;p=thirdparty%2Fhaproxy.git 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. --- 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().