From: Liu Yuan <[email protected]>

- add some comments

Signed-off-by: Liu Yuan <[email protected]>
---
 sheep/sdnet.c |   24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/sheep/sdnet.c b/sheep/sdnet.c
index 969ec6c..ea48453 100644
--- a/sheep/sdnet.c
+++ b/sheep/sdnet.c
@@ -552,15 +552,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
@@ -576,8 +574,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));
 
@@ -601,13 +598,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));
@@ -640,13 +640,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

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to