CLEANUP: remove the now unused fdtab direct I/O callbacks

They were all left to NULL since last commit so we can safely remove them
all now and remove the temporary dual polling logic in pollers.
This commit is contained in:
Willy Tarreau 2012-07-06 16:02:29 +02:00 committed by Willy Tarreau
parent 2da156fe5e
commit 076be25ab8
10 changed files with 29 additions and 109 deletions

View File

@ -66,9 +66,6 @@ enum {
/* info about one given fd */ /* info about one given fd */
struct fdtab { struct fdtab {
int (*iocb)(int fd); /* I/O handler, returns FD_WAIT_* */ int (*iocb)(int fd); /* I/O handler, returns FD_WAIT_* */
struct {
int (*f)(int fd); /* read/write function */
} cb[DIR_SIZE];
void *owner; /* the connection or listener associated with this fd, NULL if closed */ void *owner; /* the connection or listener associated with this fd, NULL if closed */
struct { /* used by pollers which support speculative polling */ struct { /* used by pollers which support speculative polling */
unsigned char e; /* read and write events status. 4 bits, may be merged into flags' lower bits */ unsigned char e; /* read and write events status. 4 bits, may be merged into flags' lower bits */

View File

@ -1482,8 +1482,6 @@ static struct task *process_chk(struct task *t)
s->check_conn->flags = CO_FL_WAIT_L4_CONN; /* TCP connection pending */ s->check_conn->flags = CO_FL_WAIT_L4_CONN; /* TCP connection pending */
fd_insert(fd); fd_insert(fd);
fdtab[fd].owner = t; fdtab[fd].owner = t;
fdtab[fd].cb[DIR_RD].f = NULL;
fdtab[fd].cb[DIR_WR].f = NULL;
fdtab[fd].iocb = &check_iocb; fdtab[fd].iocb = &check_iocb;
fdtab[fd].flags = FD_FL_TCP | FD_FL_TCP_NODELAY; fdtab[fd].flags = FD_FL_TCP | FD_FL_TCP_NODELAY;
EV_FD_SET(fd, DIR_WR); /* for connect status */ EV_FD_SET(fd, DIR_WR); /* for connect status */

View File

@ -245,6 +245,9 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
int e = epoll_events[count].events; int e = epoll_events[count].events;
fd = epoll_events[count].data.fd; fd = epoll_events[count].data.fd;
if (!fdtab[fd].owner)
continue;
/* it looks complicated but gcc can optimize it away when constants /* it looks complicated but gcc can optimize it away when constants
* have same values. * have same values.
*/ */
@ -256,22 +259,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
((e & EPOLLERR) ? FD_POLL_ERR : 0) | ((e & EPOLLERR) ? FD_POLL_ERR : 0) |
((e & EPOLLHUP) ? FD_POLL_HUP : 0); ((e & EPOLLHUP) ? FD_POLL_HUP : 0);
if ((fd_evts[FD2OFS(fd)] >> FD2BIT(fd)) & DIR2MSK(DIR_RD)) {
if (!fdtab[fd].owner)
continue;
if (fdtab[fd].ev & (FD_POLL_IN|FD_POLL_HUP|FD_POLL_ERR))
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))
if (fdtab[fd].cb[DIR_WR].f)
fdtab[fd].cb[DIR_WR].f(fd);
}
if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev) if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev)
fdtab[fd].iocb(fd); fdtab[fd].iocb(fd);
} }

View File

@ -139,25 +139,20 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
for (count = 0; count < status; count++) { for (count = 0; count < status; count++) {
fd = kev[count].ident; fd = kev[count].ident;
if (!fdtab[fd].owner)
continue;
fdtab[fd].ev &= FD_POLL_STICKY; fdtab[fd].ev &= FD_POLL_STICKY;
if (kev[count].filter == EVFILT_READ) { if (kev[count].filter == EVFILT_READ) {
if (FD_ISSET(fd, fd_evts[DIR_RD])) { if (FD_ISSET(fd, fd_evts[DIR_RD])) {
if (!fdtab[fd].owner)
continue;
fdtab[fd].ev |= FD_POLL_IN; fdtab[fd].ev |= FD_POLL_IN;
if (fdtab[fd].cb[DIR_RD].f)
fdtab[fd].cb[DIR_RD].f(fd);
} }
} else if (kev[count].filter == EVFILT_WRITE) { } else if (kev[count].filter == EVFILT_WRITE) {
if (FD_ISSET(fd, fd_evts[DIR_WR])) { if (FD_ISSET(fd, fd_evts[DIR_WR])) {
if (!fdtab[fd].owner)
continue;
fdtab[fd].ev |= FD_POLL_OUT; fdtab[fd].ev |= FD_POLL_OUT;
if (fdtab[fd].cb[DIR_WR].f)
fdtab[fd].cb[DIR_WR].f(fd)
} }
} }
if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev) if (fdtab[fd].iocb && fdtab[fd].ev)
fdtab[fd].iocb(fd); fdtab[fd].iocb(fd);
} }
} }

View File

@ -149,6 +149,12 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
if (!(e & ( POLLOUT | POLLIN | POLLERR | POLLHUP ))) if (!(e & ( POLLOUT | POLLIN | POLLERR | POLLHUP )))
continue; continue;
/* ok, we found one active fd */
status--;
if (!fdtab[fd].owner)
continue;
fdtab[fd].ev &= FD_POLL_STICKY; fdtab[fd].ev &= FD_POLL_STICKY;
fdtab[fd].ev |= fdtab[fd].ev |=
((e & POLLIN ) ? FD_POLL_IN : 0) | ((e & POLLIN ) ? FD_POLL_IN : 0) |
@ -156,25 +162,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
((e & POLLERR) ? FD_POLL_ERR : 0) | ((e & POLLERR) ? FD_POLL_ERR : 0) |
((e & POLLHUP) ? FD_POLL_HUP : 0); ((e & POLLHUP) ? FD_POLL_HUP : 0);
/* ok, we found one active fd */
status--;
if (FD_ISSET(fd, fd_evts[DIR_RD])) {
if (!fdtab[fd].owner)
continue;
if (fdtab[fd].ev & (FD_POLL_IN|FD_POLL_HUP|FD_POLL_ERR))
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))
if (fdtab[fd].cb[DIR_WR].f)
fdtab[fd].cb[DIR_WR].f(fd);
}
if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev) if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev)
fdtab[fd].iocb(fd); fdtab[fd].iocb(fd);
} }

View File

@ -146,22 +146,15 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
/* if we specify read first, the accepts and zero reads will be /* if we specify read first, the accepts and zero reads will be
* seen first. Moreover, system buffers will be flushed faster. * 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) if (!fdtab[fd].owner)
continue; continue;
fdtab[fd].ev |= FD_POLL_IN;
if (fdtab[fd].cb[DIR_RD].f)
fdtab[fd].cb[DIR_RD].f(fd);
}
if (FD_ISSET(fd, tmp_evts[DIR_WR])) { fdtab[fd].ev &= FD_POLL_STICKY;
if (!fdtab[fd].owner) if (FD_ISSET(fd, tmp_evts[DIR_RD]))
continue; fdtab[fd].ev |= FD_POLL_IN;
if (FD_ISSET(fd, tmp_evts[DIR_WR]))
fdtab[fd].ev |= FD_POLL_OUT; fdtab[fd].ev |= FD_POLL_OUT;
if (fdtab[fd].cb[DIR_WR].f)
fdtab[fd].cb[DIR_WR].f(fd);
}
if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev) if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev)
fdtab[fd].iocb(fd); fdtab[fd].iocb(fd);

View File

@ -398,6 +398,9 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
int e = epoll_events[count].events; int e = epoll_events[count].events;
fd = epoll_events[count].data.fd; fd = epoll_events[count].data.fd;
if (!fdtab[fd].owner)
continue;
/* it looks complicated but gcc can optimize it away when constants /* it looks complicated but gcc can optimize it away when constants
* have same values. * have same values.
*/ */
@ -409,22 +412,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
((e & EPOLLERR) ? FD_POLL_ERR : 0) | ((e & EPOLLERR) ? FD_POLL_ERR : 0) |
((e & EPOLLHUP) ? FD_POLL_HUP : 0); ((e & EPOLLHUP) ? FD_POLL_HUP : 0);
if ((fdtab[fd].spec.e & FD_EV_MASK_R) == FD_EV_WAIT_R) {
if (!fdtab[fd].owner)
continue;
if (fdtab[fd].ev & (FD_POLL_IN|FD_POLL_HUP|FD_POLL_ERR))
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))
if (fdtab[fd].cb[DIR_WR].f)
fdtab[fd].cb[DIR_WR].f(fd);
}
if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev) if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev)
fdtab[fd].iocb(fd); fdtab[fd].iocb(fd);
} }
@ -455,21 +442,11 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
*/ */
fdtab[fd].ev &= FD_POLL_STICKY; fdtab[fd].ev &= FD_POLL_STICKY;
if ((eo & FD_EV_MASK_R) == FD_EV_SPEC_R) { if ((eo & FD_EV_MASK_R) == FD_EV_SPEC_R)
/* The owner is interested in reading from this FD */
/* Pretend there is something to read */
fdtab[fd].ev |= FD_POLL_IN; fdtab[fd].ev |= FD_POLL_IN;
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);
}
if ((eo & FD_EV_MASK_W) == FD_EV_SPEC_W) { if ((eo & FD_EV_MASK_W) == FD_EV_SPEC_W)
/* The owner is interested in writing to this FD */
/* Pretend there is something to write */
fdtab[fd].ev |= FD_POLL_OUT; fdtab[fd].ev |= FD_POLL_OUT;
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) { if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev) {
int wait = fdtab[fd].iocb(fd); int wait = fdtab[fd].iocb(fd);

View File

@ -468,14 +468,7 @@ int tcp_connect_server(struct stream_interface *si)
fdtab[fd].flags = FD_FL_TCP | FD_FL_TCP_NODELAY; fdtab[fd].flags = FD_FL_TCP | FD_FL_TCP_NODELAY;
si->conn.flags = CO_FL_WAIT_L4_CONN; /* connection in progress */ si->conn.flags = CO_FL_WAIT_L4_CONN; /* connection in progress */
/* Prepare to send a few handshakes related to the on-wire protocol. /* Prepare to send a few handshakes related to the on-wire protocol. */
* If we have nothing to send, we want to confirm that the TCP
* connection is established before doing so, so we use our own write
* callback then switch to the sock layer.
*/
fdtab[fd].cb[DIR_RD].f = NULL;
fdtab[fd].cb[DIR_WR].f = NULL;
if (si->send_proxy_ofs) if (si->send_proxy_ofs)
si->conn.flags |= CO_FL_SI_SEND_PROXY; si->conn.flags |= CO_FL_SI_SEND_PROXY;
@ -575,11 +568,10 @@ int tcp_connect_probe(int fd)
*/ */
b->flags |= BF_WRITE_NULL; b->flags |= BF_WRITE_NULL;
/* The FD is ready now, we can hand the handlers to the socket layer /* The FD is ready now, we'll mark the connection as complete and
* and forward the event there to start working on the socket. * forward the event to the data layer which will update the stream
* interface flags.
*/ */
fdtab[fd].cb[DIR_RD].f = NULL;
fdtab[fd].cb[DIR_WR].f = NULL;
conn->flags &= ~CO_FL_WAIT_L4_CONN; conn->flags &= ~CO_FL_WAIT_L4_CONN;
si->exp = TICK_ETERNITY; si->exp = TICK_ETERNITY;
return si_data(si)->write(fd); return si_data(si)->write(fd);
@ -739,8 +731,6 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen)
fdtab[fd].owner = listener; /* reference the listener instead of a task */ fdtab[fd].owner = listener; /* reference the listener instead of a task */
fdtab[fd].flags = FD_FL_TCP | ((listener->options & LI_O_NOLINGER) ? FD_FL_TCP_NOLING : 0); fdtab[fd].flags = FD_FL_TCP | ((listener->options & LI_O_NOLINGER) ? FD_FL_TCP_NOLING : 0);
fdtab[fd].iocb = listener->proto->accept; fdtab[fd].iocb = listener->proto->accept;
fdtab[fd].cb[DIR_RD].f = NULL; /* never called */
fdtab[fd].cb[DIR_WR].f = NULL; /* never called */
fd_insert(fd); fd_insert(fd);
tcp_return: tcp_return:

View File

@ -263,8 +263,6 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle
/* the function for the accept() event */ /* the function for the accept() event */
fd_insert(fd); fd_insert(fd);
fdtab[fd].iocb = listener->proto->accept; fdtab[fd].iocb = listener->proto->accept;
fdtab[fd].cb[DIR_RD].f = NULL; /* never called */
fdtab[fd].cb[DIR_WR].f = NULL; /* never called */
fdtab[fd].owner = listener; /* reference the listener instead of a task */ fdtab[fd].owner = listener; /* reference the listener instead of a task */
return ERR_NONE; return ERR_NONE;
err_rename: err_rename:

View File

@ -283,8 +283,6 @@ int session_accept(struct listener *l, int cfd, struct sockaddr_storage *addr)
fd_insert(cfd); fd_insert(cfd);
fdtab[cfd].owner = &s->si[0].conn; fdtab[cfd].owner = &s->si[0].conn;
fdtab[cfd].flags = 0; fdtab[cfd].flags = 0;
fdtab[cfd].cb[DIR_RD].f = NULL;
fdtab[cfd].cb[DIR_WR].f = NULL;
fdtab[cfd].iocb = conn_fd_handler; fdtab[cfd].iocb = conn_fd_handler;
EV_FD_SET(cfd, DIR_RD); EV_FD_SET(cfd, DIR_RD);