MEDIUM: checks: make use of fdtab->iocb instead of cb[]
Use the single I/O callback to handle the checks. This should soon be
replaced by the common connection handler.
diff --git a/src/checks.c b/src/checks.c
index f24e1fa..d386168 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -1249,6 +1249,25 @@
return 0;
}
+/* I/O call back for the health checks. Returns FD_WAIT_*. */
+static int check_iocb(int fd)
+{
+ int ret = 0;
+ int e;
+
+ if (!fdtab[fd].owner)
+ return ret;
+
+ e = fdtab[fd].ev;
+ if (e & (FD_POLL_IN | FD_POLL_HUP | FD_POLL_ERR))
+ if (!event_srv_chk_r(fd))
+ ret |= FD_WAIT_READ;
+ if (e & (FD_POLL_OUT | FD_POLL_ERR))
+ if (!event_srv_chk_w(fd))
+ ret |= FD_WAIT_WRITE;
+ return ret;
+}
+
/*
* updates the server's weight during a warmup stage. Once the final weight is
* reached, the task automatically stops. Note that any server status change
@@ -1463,9 +1482,9 @@
s->check_conn->flags = CO_FL_WAIT_L4_CONN; /* TCP connection pending */
fd_insert(fd);
fdtab[fd].owner = t;
- fdtab[fd].cb[DIR_RD].f = &event_srv_chk_r;
- fdtab[fd].cb[DIR_WR].f = &event_srv_chk_w;
- fdtab[fd].iocb = NULL;
+ fdtab[fd].cb[DIR_RD].f = NULL;
+ fdtab[fd].cb[DIR_WR].f = NULL;
+ fdtab[fd].iocb = &check_iocb;
fdtab[fd].flags = FD_FL_TCP | FD_FL_TCP_NODELAY;
EV_FD_SET(fd, DIR_WR); /* for connect status */
#ifdef DEBUG_FULL