[sheepdog] [PATCH 4/7] net: clean up client_tx_handler()
Liu Yuan
namei.unix at gmail.com
Wed Jul 18 11:35:37 CEST 2012
From: Liu Yuan <tailai.ly at taobao.com>
- add some comments
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
sheep/sdnet.c | 24 +++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/sheep/sdnet.c b/sheep/sdnet.c
index 2e769d6..54ce6bd 100644
--- a/sheep/sdnet.c
+++ b/sheep/sdnet.c
@@ -550,15 +550,13 @@ static void client_rx_handler(struct client_info *ci)
if (is_conn_dead(conn))
return clear_client_info(ci);
+ /* Short read happens */
if (conn->c_rx_state != C_IO_END)
return;
/* now we have a complete command */
-
req = ci->rx_req;
-
init_rx_hdr(ci);
-
if (hdr->flags & SD_FLAG_CMD_WRITE)
req->rp.data_length = 0;
else
@@ -574,8 +572,7 @@ static void init_tx_hdr(struct client_info *ci)
struct sd_rsp *rsp = (struct sd_rsp *)&ci->conn.tx_hdr;
struct request *req;
- if (ci->tx_req || list_empty(&ci->done_reqs))
- return;
+ assert(!list_empty(&ci->done_reqs));
memset(rsp, 0, sizeof(*rsp));
@@ -599,13 +596,16 @@ static void client_tx_handler(struct client_info *ci)
{
int ret, opt;
struct sd_rsp *rsp = (struct sd_rsp *)&ci->conn.tx_hdr;
-again:
- init_tx_hdr(ci);
- if (!ci->tx_req) {
+
+ if (list_empty(&ci->done_reqs)) {
if (conn_tx_off(&ci->conn))
clear_client_info(ci);
return;
}
+again:
+ /* If short send happens, we don't need init hdr */
+ if (!ci->tx_req)
+ init_tx_hdr(ci);
opt = 1;
setsockopt(ci->conn.fd, SOL_TCP, TCP_CORK, &opt, sizeof(opt));
@@ -638,13 +638,19 @@ again:
if (is_conn_dead(&ci->conn))
return clear_client_info(ci);
+ /* Finish sending one response */
if (ci->conn.c_tx_state == C_IO_END) {
dprintf("connection from: %d, %s:%d\n", ci->conn.fd,
ci->conn.ipstr, ci->conn.port);
free_request(ci->tx_req);
ci->tx_req = NULL;
- goto again;
}
+ /* Short send happens or we have more data to send */
+ if (ci->tx_req || !list_empty(&ci->done_reqs))
+ goto again;
+ else
+ if (conn_tx_off(&ci->conn))
+ clear_client_info(ci);
}
static void destroy_client(struct client_info *ci)
--
1.7.10.2
More information about the sheepdog
mailing list