]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: polling: prepare to call the iocb() function when defined.
authorWilly Tarreau <wtarreau@exceliance.fr>
Fri, 6 Jul 2012 09:44:28 +0000 (11:44 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 2 Sep 2012 19:51:27 +0000 (21:51 +0200)
We will need this to centralize I/O callbacks. Nobody sets it right
now so the code should have no impact.

src/ev_epoll.c
src/ev_kqueue.c
src/ev_poll.c
src/ev_select.c
src/ev_sepoll.c

index 482992ee6271b6bc455f63164e279d7ee346d7c7..589932fd40d735eac2cc86e65cbb60af2e75925b 100644 (file)
@@ -260,15 +260,20 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
                        if (!fdtab[fd].owner)
                                continue;
                        if (fdtab[fd].ev & (FD_POLL_IN|FD_POLL_HUP|FD_POLL_ERR))
-                               fdtab[fd].cb[DIR_RD].f(fd);
+                               if (fdtab[fd].cb[DIR_RD].f)
+                                       fdtab[fd].cb[DIR_RD].f(fd);
                }
 
                if ((fd_evts[FD2OFS(fd)] >> FD2BIT(fd)) & DIR2MSK(DIR_WR)) {
                        if (!fdtab[fd].owner)
                                continue;
                        if (fdtab[fd].ev & (FD_POLL_OUT|FD_POLL_ERR|FD_POLL_HUP))
-                               fdtab[fd].cb[DIR_WR].f(fd);
+                               if (fdtab[fd].cb[DIR_WR].f)
+                                       fdtab[fd].cb[DIR_WR].f(fd);
                }
+
+               if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev)
+                       fdtab[fd].iocb(fd);
        }
 }
 
index b27f37231bdb11b50369bcd3859457c504e56d5c..556abccb23d091dcc591eee6c7909cee72f59f32 100644 (file)
@@ -138,21 +138,27 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
 
        for (count = 0; count < status; count++) {
                fd = kev[count].ident;
+
+               fdtab[fd].ev &= FD_POLL_STICKY;
                if (kev[count].filter ==  EVFILT_READ) {
                        if (FD_ISSET(fd, fd_evts[DIR_RD])) {
                                if (!fdtab[fd].owner)
                                        continue;
                                fdtab[fd].ev |= FD_POLL_IN;
-                               fdtab[fd].cb[DIR_RD].f(fd);
+                               if (fdtab[fd].cb[DIR_RD].f)
+                                       fdtab[fd].cb[DIR_RD].f(fd);
                        }
                } else if (kev[count].filter ==  EVFILT_WRITE) {
                        if (FD_ISSET(fd, fd_evts[DIR_WR])) {
                                if (!fdtab[fd].owner)
                                        continue;
                                fdtab[fd].ev |= FD_POLL_OUT;
-                               fdtab[fd].cb[DIR_WR].f(fd);
+                               if (fdtab[fd].cb[DIR_WR].f)
+                                       fdtab[fd].cb[DIR_WR].f(fd)
                        }
                }
+               if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev)
+                       fdtab[fd].iocb(fd);
        }
 }
 
index 6351a72f0d41ae38e08831fee64591bf76156cf3..015ff76c277b1fa963844c1552ec2a8bac46868a 100644 (file)
@@ -163,15 +163,20 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
                        if (!fdtab[fd].owner)
                                continue;
                        if (fdtab[fd].ev & (FD_POLL_IN|FD_POLL_HUP|FD_POLL_ERR))
-                               fdtab[fd].cb[DIR_RD].f(fd);
+                               if (fdtab[fd].cb[DIR_RD].f)
+                                       fdtab[fd].cb[DIR_RD].f(fd);
                }
          
                if (FD_ISSET(fd, fd_evts[DIR_WR])) {
                        if (!fdtab[fd].owner)
                                continue;
                        if (fdtab[fd].ev & (FD_POLL_OUT|FD_POLL_ERR|FD_POLL_HUP))
-                               fdtab[fd].cb[DIR_WR].f(fd);
+                               if (fdtab[fd].cb[DIR_WR].f)
+                                       fdtab[fd].cb[DIR_WR].f(fd);
                }
+
+               if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev)
+                       fdtab[fd].iocb(fd);
        }
 
 }
index 64031cc3eeec43da132d6103c9bf2d62a8e0dd59..b1c41bc87f463425ed8d7820fd3403d96bcf5e41 100644 (file)
@@ -146,19 +146,25 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
                        /* if we specify read first, the accepts and zero reads will be
                         * seen first. Moreover, system buffers will be flushed faster.
                         */
+                       fdtab[fd].ev &= FD_POLL_STICKY;
                        if (FD_ISSET(fd, tmp_evts[DIR_RD])) {
                                if (!fdtab[fd].owner)
                                        continue;
                                fdtab[fd].ev |= FD_POLL_IN;
-                               fdtab[fd].cb[DIR_RD].f(fd);
+                               if (fdtab[fd].cb[DIR_RD].f)
+                                       fdtab[fd].cb[DIR_RD].f(fd);
                        }
 
                        if (FD_ISSET(fd, tmp_evts[DIR_WR])) {
                                if (!fdtab[fd].owner)
                                        continue;
                                fdtab[fd].ev |= FD_POLL_OUT;
-                               fdtab[fd].cb[DIR_WR].f(fd);
+                               if (fdtab[fd].cb[DIR_WR].f)
+                                       fdtab[fd].cb[DIR_WR].f(fd);
                        }
+
+                       if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev)
+                               fdtab[fd].iocb(fd);
                }
        }
 }
index 049eb309d27343bc7e96b25bdb3f9a8932edc37d..55c81eab9bb3506c6bbe27796e3b03f5d9a3d7b1 100644 (file)
@@ -413,15 +413,20 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
                        if (!fdtab[fd].owner)
                                continue;
                        if (fdtab[fd].ev & (FD_POLL_IN|FD_POLL_HUP|FD_POLL_ERR))
-                               fdtab[fd].cb[DIR_RD].f(fd);
+                               if (fdtab[fd].cb[DIR_RD].f)
+                                       fdtab[fd].cb[DIR_RD].f(fd);
                }
 
                if ((fdtab[fd].spec.e & FD_EV_MASK_W) == FD_EV_WAIT_W) {
                        if (!fdtab[fd].owner)
                                continue;
                        if (fdtab[fd].ev & (FD_POLL_OUT|FD_POLL_ERR))
-                               fdtab[fd].cb[DIR_WR].f(fd);
+                               if (fdtab[fd].cb[DIR_WR].f)
+                                       fdtab[fd].cb[DIR_WR].f(fd);
                }
+
+               if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev)
+                       fdtab[fd].iocb(fd);
        }
 
        /* now process speculative events if any */
@@ -454,7 +459,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
                        /* The owner is interested in reading from this FD */
                        /* Pretend there is something to read */
                        fdtab[fd].ev |= FD_POLL_IN;
-                       if (!fdtab[fd].cb[DIR_RD].f(fd))
+                       if (fdtab[fd].cb[DIR_RD].f && !fdtab[fd].cb[DIR_RD].f(fd))
                                fdtab[fd].spec.e ^= (FD_EV_WAIT_R ^ FD_EV_SPEC_R);
                }
 
@@ -462,7 +467,21 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
                        /* The owner is interested in writing to this FD */
                        /* Pretend there is something to write */
                        fdtab[fd].ev |= FD_POLL_OUT;
-                       if (!fdtab[fd].cb[DIR_WR].f(fd))
+                       if (fdtab[fd].cb[DIR_WR].f && !fdtab[fd].cb[DIR_WR].f(fd))
+                               fdtab[fd].spec.e ^= (FD_EV_WAIT_W ^ FD_EV_SPEC_W);
+               }
+
+               if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev) {
+                       int wait = fdtab[fd].iocb(fd);
+
+                       /* FIXME: warning, this will not work if both old and new
+                        * callbacks are used at the same time ! This is only a
+                        * temporary measure during the migration.
+                        */
+                       if (wait & FD_WAIT_READ)
+                               fdtab[fd].spec.e ^= (FD_EV_WAIT_R ^ FD_EV_SPEC_R);
+
+                       if (wait & FD_WAIT_WRITE)
                                fdtab[fd].spec.e ^= (FD_EV_WAIT_W ^ FD_EV_SPEC_W);
                }