aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2013-08-21 23:08:38 +0200
committerDaniel Stenberg <daniel@haxx.se>2013-08-22 22:55:25 +0200
commit22adb46a32beee185165c3dba444c3e6d660fb8f (patch)
treeebaaa40575dbab243c93848d63ea22603cdfd957
parentfc99eaa5aee981e7ecc85290d964f2a5b4eb1bde (diff)
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
-rw-r--r--lib/multi.c14
1 files changed, 3 insertions, 11 deletions
diff --git a/lib/multi.c b/lib/multi.c
index 93be7700a..6b4236198 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: