mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
multi: remove_handle: move pending connections
If the handle removed from the multi handle happens to be the one "owning" the pipeline other transfers will be waiting indefinitely. Now we move such handles back to connect to have them race (again) for getting the connection and thus avoid hanging. Bug: http://curl.haxx.se/bug/view.cgi?id=1465 Reported-by: Jiri Dvorak
This commit is contained in:
parent
31987c340e
commit
787c2ae91b
@ -504,18 +504,22 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
|||||||
if(!data->multi)
|
if(!data->multi)
|
||||||
return CURLM_OK; /* it is already removed so let's say it is fine! */
|
return CURLM_OK; /* it is already removed so let's say it is fine! */
|
||||||
|
|
||||||
|
|
||||||
premature = (data->mstate < CURLM_STATE_COMPLETED) ? TRUE : FALSE;
|
premature = (data->mstate < CURLM_STATE_COMPLETED) ? TRUE : FALSE;
|
||||||
easy_owns_conn = (data->easy_conn && (data->easy_conn->data == easy)) ?
|
easy_owns_conn = (data->easy_conn && (data->easy_conn->data == easy)) ?
|
||||||
TRUE : FALSE;
|
TRUE : FALSE;
|
||||||
|
|
||||||
/* If the 'state' is not INIT or COMPLETED, we might need to do something
|
/* If the 'state' is not INIT or COMPLETED, we might need to do something
|
||||||
nice to put the easy_handle in a good known state when this returns. */
|
nice to put the easy_handle in a good known state when this returns. */
|
||||||
if(premature)
|
if(premature) {
|
||||||
/* this handle is "alive" so we need to count down the total number of
|
/* this handle is "alive" so we need to count down the total number of
|
||||||
alive connections when this is removed */
|
alive connections when this is removed */
|
||||||
multi->num_alive--;
|
multi->num_alive--;
|
||||||
|
|
||||||
|
/* When this handle gets removed, other handles may be able to get the
|
||||||
|
connection */
|
||||||
|
Curl_multi_process_pending_handles(multi);
|
||||||
|
}
|
||||||
|
|
||||||
if(data->easy_conn &&
|
if(data->easy_conn &&
|
||||||
data->mstate > CURLM_STATE_DO &&
|
data->mstate > CURLM_STATE_DO &&
|
||||||
data->mstate < CURLM_STATE_COMPLETED) {
|
data->mstate < CURLM_STATE_COMPLETED) {
|
||||||
|
Loading…
Reference in New Issue
Block a user