From: Willy Tarreau Date: Tue, 11 Apr 2017 17:59:33 +0000 (+0200) Subject: MINOR: connection: send data before receiving X-Git-Tag: v1.8-dev3~263 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57ec32fb993d4b426ccca7ed2322eacbf9218596;p=thirdparty%2Fhaproxy.git MINOR: connection: send data before receiving It's more efficient this way, as it allows to flush a send buffer before receiving data in the other one. This can lead to a slightly faster buffer recycling, thus slightly less memory and a small performance increase by using a hotter cache. --- diff --git a/src/connection.c b/src/connection.c index f054cd13b7..0c90c3b437 100644 --- a/src/connection.c +++ b/src/connection.c @@ -94,28 +94,28 @@ void conn_fd_handler(int fd) if ((conn->flags & CO_FL_INIT_DATA) && conn->data->init(conn) < 0) return; - /* The data transfer starts here and stops on error and handshakes. Note - * that we must absolutely test conn->xprt at each step in case it suddenly - * changes due to a quick unexpected close(). - */ - if (conn->xprt && fd_recv_ready(fd) && - ((conn->flags & (CO_FL_DATA_RD_ENA|CO_FL_WAIT_ROOM|CO_FL_ERROR|CO_FL_HANDSHAKE)) == CO_FL_DATA_RD_ENA)) { + if (conn->xprt && fd_send_ready(fd) && + ((conn->flags & (CO_FL_DATA_WR_ENA|CO_FL_ERROR|CO_FL_HANDSHAKE)) == CO_FL_DATA_WR_ENA)) { /* force reporting of activity by clearing the previous flags : * we'll have at least ERROR or CONNECTED at the end of an I/O, * both of which will be detected below. */ flags = 0; - conn->data->recv(conn); + conn->data->send(conn); } - if (conn->xprt && fd_send_ready(fd) && - ((conn->flags & (CO_FL_DATA_WR_ENA|CO_FL_ERROR|CO_FL_HANDSHAKE)) == CO_FL_DATA_WR_ENA)) { + /* The data transfer starts here and stops on error and handshakes. Note + * that we must absolutely test conn->xprt at each step in case it suddenly + * changes due to a quick unexpected close(). + */ + if (conn->xprt && fd_recv_ready(fd) && + ((conn->flags & (CO_FL_DATA_RD_ENA|CO_FL_WAIT_ROOM|CO_FL_ERROR|CO_FL_HANDSHAKE)) == CO_FL_DATA_RD_ENA)) { /* force reporting of activity by clearing the previous flags : * we'll have at least ERROR or CONNECTED at the end of an I/O, * both of which will be detected below. */ flags = 0; - conn->data->send(conn); + conn->data->recv(conn); } /* It may happen during the data phase that a handshake is