From 22adb46a32beee185165c3dba444c3e6d660fb8f Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Wed, 21 Aug 2013 23:08:38 +0200
Subject: [PATCH] multi: move on from STATE_DONE faster

Make sure we always return CURLM_CALL_MULTI_PERFORM when we reach
CURLM_STATE_DONE since the state is transient and it can very well
continue executing as there is nothing to wait for.

Bug: http://curl.haxx.se/mail/lib-2013-08/0211.html
Reported-by: Yi Huang
---
 lib/multi.c | 14 +++-----------
 1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/lib/multi.c b/lib/multi.c
index 93be7700a0..6b4236198d 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1556,21 +1556,15 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       }
 
     case CURLM_STATE_DONE:
+      /* this state is highly transient, so run another loop after this */
+      result = CURLM_CALL_MULTI_PERFORM;
 
       if(data->easy_conn) {
         /* Remove ourselves from the receive pipeline, if we are there. */
-        Curl_removeHandleFromPipeline(data,
-                                      data->easy_conn->recv_pipe);
+        Curl_removeHandleFromPipeline(data, data->easy_conn->recv_pipe);
         /* Check if we can move pending requests to send pipe */
         Curl_multi_process_pending_handles(multi);
 
-        if(data->easy_conn->bits.stream_was_rewound) {
-          /* This request read past its response boundary so we quickly let
-             the other requests consume those bytes since there is no
-             guarantee that the socket will become active again */
-          result = CURLM_CALL_MULTI_PERFORM;
-        }
-
         /* post-transfer command */
         data->result = Curl_done(&data->easy_conn, CURLE_OK, FALSE);
         /*
@@ -1587,7 +1581,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
         if(data->wildcard.state != CURLWC_DONE) {
           /* if a wildcard is set and we are not ending -> lets start again
              with CURLM_STATE_INIT */
-          result = CURLM_CALL_MULTI_PERFORM;
           multistate(data, CURLM_STATE_INIT);
           break;
         }
@@ -1596,7 +1589,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       /* after we have DONE what we're supposed to do, go COMPLETED, and
          it doesn't matter what the Curl_done() returned! */
       multistate(data, CURLM_STATE_COMPLETED);
-
       break;
 
     case CURLM_STATE_COMPLETED:
-- 
GitLab