]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MINOR] ev_sepoll: refine flags management.
authorWilly Tarreau <w@1wt.eu>
Mon, 30 Apr 2007 10:56:21 +0000 (12:56 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 30 Apr 2007 12:38:00 +0000 (14:38 +0200)
Ensure that we don't call the event handlers if the FD is already
marked FD_STERROR, and ensure that we properly catch HUP and ERR.

src/ev_sepoll.c

index 24a343e387432d7ebeda785420aca2f566afd752..74917add8e9c0d83650d94a77f8d921bced75b36 100644 (file)
@@ -295,7 +295,7 @@ REGPRM2 static void _do_poll(struct poller *p, int wait_time)
                fdtab[fd].ev = 0;
 
                if ((fd_list[fd].e & FD_EV_MASK_R) == FD_EV_SPEC_R) {
-                       if (fdtab[fd].state != FD_STCLOSE) {
+                       if (fdtab[fd].state != FD_STCLOSE && fdtab[fd].state != FD_STERROR) {
                                fdtab[fd].ev |= FD_POLL_IN;
                                if (fdtab[fd].cb[DIR_RD].f(fd) == 0)
                                        status |= EPOLLIN;
@@ -303,7 +303,7 @@ REGPRM2 static void _do_poll(struct poller *p, int wait_time)
                }
                
                if ((fd_list[fd].e & FD_EV_MASK_W) == FD_EV_SPEC_W) {
-                       if (fdtab[fd].state != FD_STCLOSE) {
+                       if (fdtab[fd].state != FD_STCLOSE && fdtab[fd].state != FD_STERROR) {
                                fdtab[fd].ev |= FD_POLL_OUT;
                                if (fdtab[fd].cb[DIR_WR].f(fd) == 0)
                                        status |= EPOLLOUT;
@@ -383,16 +383,16 @@ REGPRM2 static void _do_poll(struct poller *p, int wait_time)
                        ((e & EPOLLHUP) ? FD_POLL_HUP : 0);
                
                if ((fd_list[fd].e & FD_EV_MASK_R) == FD_EV_WAIT_R) {
-                       if (fdtab[fd].state == FD_STCLOSE)
+                       if (fdtab[fd].state == FD_STCLOSE || fdtab[fd].state == FD_STERROR)
                                continue;
-                       if (fdtab[fd].ev & FD_POLL_RD)
+                       if (fdtab[fd].ev & (FD_POLL_RD|FD_POLL_HUP|FD_POLL_ERR))
                                fdtab[fd].cb[DIR_RD].f(fd);
                }
 
                if ((fd_list[fd].e & FD_EV_MASK_W) == FD_EV_WAIT_W) {
-                       if (fdtab[fd].state == FD_STCLOSE)
+                       if (fdtab[fd].state == FD_STCLOSE || fdtab[fd].state == FD_STERROR)
                                continue;
-                       if (fdtab[fd].ev & FD_POLL_WR)
+                       if (fdtab[fd].ev & (FD_POLL_WR|FD_POLL_ERR))
                                fdtab[fd].cb[DIR_WR].f(fd);
                }
        }