OPTIM: stream_interface: return directly if the connection flag CO_FL_ERROR has been set

The connection flag CO_FL_ERROR will be tested in the functions both
si_conn_recv_cb() and si_conn_send_cb(). If CO_FL_ERROR has been set, out_error
branch will be executed. But the only job of out_error branch is to set
CO_FL_ERROR on connection flag. So it's better return directly than goto
out_error branch under such conditions. As a result, out_error branch becomes
needless and can be removed.

In addition, the return type of si_conn_send_loop() is also changed to void.
The caller should check conn->flags for errors just like stream_int_chk_snd_conn()
does as below:

static void stream_int_chk_snd_conn(struct stream_interface *si)
{
	...
        conn_refresh_polling_flags(si->conn);

-       if (si_conn_send(si->conn) < 0) {
+       si_conn_send(si->conn);
+       if (si->conn->flags & CO_FL_ERROR) {
	...
}

Signed-off-by: Godbach <nylzhaowei@gmail.com>
This commit is contained in:
Godbach 2013-12-04 17:24:06 +08:00 committed by Willy Tarreau
parent 64cef79348
commit 4f48990c1a

View File

@ -608,11 +608,11 @@ static int si_conn_wake_cb(struct connection *conn)
/* /*
* This function is called to send buffer data to a stream socket. * This function is called to send buffer data to a stream socket.
* It returns -1 in case of unrecoverable error, otherwise zero.
* It calls the transport layer's snd_buf function. It relies on the * It calls the transport layer's snd_buf function. It relies on the
* caller to commit polling changes. * caller to commit polling changes. The caller should check conn->flags
* for errors.
*/ */
static int si_conn_send(struct connection *conn) static void si_conn_send(struct connection *conn)
{ {
struct stream_interface *si = conn->owner; struct stream_interface *si = conn->owner;
struct channel *chn = si->ob; struct channel *chn = si->ob;
@ -629,14 +629,14 @@ static int si_conn_send(struct connection *conn)
} }
if (conn->flags & CO_FL_ERROR) if (conn->flags & CO_FL_ERROR)
return -1; return;
} }
/* At this point, the pipe is empty, but we may still have data pending /* At this point, the pipe is empty, but we may still have data pending
* in the normal buffer. * in the normal buffer.
*/ */
if (!chn->buf->o) if (!chn->buf->o)
return 0; return;
/* when we're here, we already know that there is no spliced /* when we're here, we already know that there is no spliced
* data left, and that there are sendable buffered data. * data left, and that there are sendable buffered data.
@ -675,10 +675,7 @@ static int si_conn_send(struct connection *conn)
} }
} }
if (conn->flags & CO_FL_ERROR) return;
return -1;
return 0;
} }
@ -821,12 +818,12 @@ static void stream_int_chk_snd_conn(struct stream_interface *si)
conn_refresh_polling_flags(si->conn); conn_refresh_polling_flags(si->conn);
if (si_conn_send(si->conn) < 0) { si_conn_send(si->conn);
if (si->conn->flags & CO_FL_ERROR) {
/* Write error on the file descriptor */ /* Write error on the file descriptor */
fd_stop_both(si->conn->t.sock.fd); fd_stop_both(si->conn->t.sock.fd);
__conn_data_stop_both(si->conn); __conn_data_stop_both(si->conn);
si->flags |= SI_FL_ERR; si->flags |= SI_FL_ERR;
si->conn->flags |= CO_FL_ERROR;
goto out_wakeup; goto out_wakeup;
} }
} }
@ -915,7 +912,7 @@ static void si_conn_recv_cb(struct connection *conn)
* which rejects it before reading it all. * which rejects it before reading it all.
*/ */
if (conn->flags & CO_FL_ERROR) if (conn->flags & CO_FL_ERROR)
goto out_error; return;
/* stop here if we reached the end of data */ /* stop here if we reached the end of data */
if (conn_data_read0_pending(conn)) if (conn_data_read0_pending(conn))
@ -968,7 +965,7 @@ static void si_conn_recv_cb(struct connection *conn)
goto out_shutdown_r; goto out_shutdown_r;
if (conn->flags & CO_FL_ERROR) if (conn->flags & CO_FL_ERROR)
goto out_error; return;
if (conn->flags & CO_FL_WAIT_ROOM) { if (conn->flags & CO_FL_WAIT_ROOM) {
/* the pipe is full or we have read enough data that it /* the pipe is full or we have read enough data that it
@ -1098,7 +1095,7 @@ static void si_conn_recv_cb(struct connection *conn)
} /* while !flags */ } /* while !flags */
if (conn->flags & CO_FL_ERROR) if (conn->flags & CO_FL_ERROR)
goto out_error; return;
if (conn_data_read0_pending(conn)) if (conn_data_read0_pending(conn))
/* connection closed */ /* connection closed */
@ -1114,10 +1111,6 @@ static void si_conn_recv_cb(struct connection *conn)
stream_sock_read0(si); stream_sock_read0(si);
conn_data_read0(conn); conn_data_read0(conn);
return; return;
out_error:
/* Read error on the connection, report the error and stop I/O */
conn->flags |= CO_FL_ERROR;
} }
/* /*
@ -1131,7 +1124,7 @@ static void si_conn_send_cb(struct connection *conn)
struct channel *chn = si->ob; struct channel *chn = si->ob;
if (conn->flags & CO_FL_ERROR) if (conn->flags & CO_FL_ERROR)
goto out_error; return;
if (si->conn->flags & CO_FL_HANDSHAKE) if (si->conn->flags & CO_FL_HANDSHAKE)
/* a handshake was requested */ /* a handshake was requested */
@ -1142,15 +1135,10 @@ static void si_conn_send_cb(struct connection *conn)
return; return;
/* OK there are data waiting to be sent */ /* OK there are data waiting to be sent */
if (si_conn_send(conn) < 0) si_conn_send(conn);
goto out_error;
/* OK all done */ /* OK all done */
return; return;
out_error:
/* Write error on the connection, report the error and stop I/O */
conn->flags |= CO_FL_ERROR;
} }
/* /*