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>
diff --git a/src/stream_interface.c b/src/stream_interface.c
index 9f0c26a..6fdaff3 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -608,11 +608,11 @@
 
 /*
  * 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
- * 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 channel *chn = si->ob;
@@ -629,14 +629,14 @@
 		}
 
 		if (conn->flags & CO_FL_ERROR)
-			return -1;
+			return;
 	}
 
 	/* At this point, the pipe is empty, but we may still have data pending
 	 * in the normal buffer.
 	 */
 	if (!chn->buf->o)
-		return 0;
+		return;
 
 	/* when we're here, we already know that there is no spliced
 	 * data left, and that there are sendable buffered data.
@@ -675,10 +675,7 @@
 		}
 	}
 
-	if (conn->flags & CO_FL_ERROR)
-		return -1;
-
-	return 0;
+	return;
 }
 
 
@@ -821,12 +818,12 @@
 
 		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 */
 			fd_stop_both(si->conn->t.sock.fd);
 			__conn_data_stop_both(si->conn);
 			si->flags |= SI_FL_ERR;
-			si->conn->flags |= CO_FL_ERROR;
 			goto out_wakeup;
 		}
 	}
@@ -915,7 +912,7 @@
 	 * which rejects it before reading it all.
 	 */
 	if (conn->flags & CO_FL_ERROR)
-		goto out_error;
+		return;
 
 	/* stop here if we reached the end of data */
 	if (conn_data_read0_pending(conn))
@@ -968,7 +965,7 @@
 			goto out_shutdown_r;
 
 		if (conn->flags & CO_FL_ERROR)
-			goto out_error;
+			return;
 
 		if (conn->flags & CO_FL_WAIT_ROOM) {
 			/* the pipe is full or we have read enough data that it
@@ -1098,7 +1095,7 @@
 	} /* while !flags */
 
 	if (conn->flags & CO_FL_ERROR)
-		goto out_error;
+		return;
 
 	if (conn_data_read0_pending(conn))
 		/* connection closed */
@@ -1114,10 +1111,6 @@
 	stream_sock_read0(si);
 	conn_data_read0(conn);
 	return;
-
- out_error:
-	/* Read error on the connection, report the error and stop I/O */
-	conn->flags |= CO_FL_ERROR;
 }
 
 /*
@@ -1131,7 +1124,7 @@
 	struct channel *chn = si->ob;
 
 	if (conn->flags & CO_FL_ERROR)
-		goto out_error;
+		return;
 
 	if (si->conn->flags & CO_FL_HANDSHAKE)
 		/* a handshake was requested */
@@ -1142,15 +1135,10 @@
 		return;
 
 	/* OK there are data waiting to be sent */
-	if (si_conn_send(conn) < 0)
-		goto out_error;
+	si_conn_send(conn);
 
 	/* OK all done */
 	return;
-
- out_error:
-	/* Write error on the connection, report the error and stop I/O */
-	conn->flags |= CO_FL_ERROR;
 }
 
 /*