diff options
author | Daniel Stenberg <daniel@haxx.se> | 2013-08-21 23:08:38 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2013-08-22 22:55:25 +0200 |
commit | 22adb46a32beee185165c3dba444c3e6d660fb8f (patch) | |
tree | ebaaa40575dbab243c93848d63ea22603cdfd957 | |
parent | fc99eaa5aee981e7ecc85290d964f2a5b4eb1bde (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.c | 14 |
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: |