From: Willy Tarreau Date: Thu, 25 Jan 2018 15:48:46 +0000 (+0100) Subject: MEDIUM: select: make use of hap_fd_* functions X-Git-Tag: v1.9-dev1~474 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d51a507dbd390e10b149442cd2f4fba93e455aa3;p=thirdparty%2Fhaproxy.git MEDIUM: select: make use of hap_fd_* functions Given that FD_{CLR,SET} are not always guaranteed to be thread safe, let's fall back to using the hap_fd_* functions as we used to till 1.5-dev18 and as poll() continues to use. This will make it easier to remove the poll_lock. --- diff --git a/src/ev_select.c b/src/ev_select.c index 2a62ba92ce..9b6e2d0dfe 100644 --- a/src/ev_select.c +++ b/src/ev_select.c @@ -26,15 +26,15 @@ /* private data */ static int maxfd; /* # of the highest fd + 1 */ -static fd_set *fd_evts[2]; +static unsigned int *fd_evts[2]; static THREAD_LOCAL fd_set *tmp_evts[2]; /* Immediately remove the entry upon close() */ REGPRM1 static void __fd_clo(int fd) { HA_SPIN_LOCK(POLL_LOCK, &poll_lock); - FD_CLR(fd, fd_evts[DIR_RD]); - FD_CLR(fd, fd_evts[DIR_WR]); + hap_fd_clr(fd, fd_evts[DIR_RD]); + hap_fd_clr(fd, fd_evts[DIR_WR]); HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock); } @@ -75,21 +75,20 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) /* poll status changed, update the lists */ HA_SPIN_LOCK(POLL_LOCK, &poll_lock); if ((eo & ~en) & FD_EV_POLLED_R) - FD_CLR(fd, fd_evts[DIR_RD]); + hap_fd_clr(fd, fd_evts[DIR_RD]); else if ((en & ~eo) & FD_EV_POLLED_R) { - FD_SET(fd, fd_evts[DIR_RD]); + hap_fd_set(fd, fd_evts[DIR_RD]); if (fd > max_add_fd) max_add_fd = fd; } if ((eo & ~en) & FD_EV_POLLED_W) - FD_CLR(fd, fd_evts[DIR_WR]); + hap_fd_clr(fd, fd_evts[DIR_WR]); else if ((en & ~eo) & FD_EV_POLLED_W) { - FD_SET(fd, fd_evts[DIR_WR]); + hap_fd_set(fd, fd_evts[DIR_WR]); if (fd > max_add_fd) max_add_fd = fd; } - HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock); } } @@ -123,16 +122,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) writenotnull |= (*(((int*)tmp_evts[DIR_WR])+i) = *(((int*)fd_evts[DIR_WR])+i)) != 0; } -#if 0 - /* just a verification code, needs to be removed for performance */ - for (i=0; i