diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/multi.c | 15 | ||||
-rw-r--r-- | lib/urldata.h | 3 |
2 files changed, 11 insertions, 7 deletions
diff --git a/lib/multi.c b/lib/multi.c index ec9fd3309..54037b358 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -413,6 +413,9 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle, easy->easy_handle = easy_handle; multistate(easy, CURLM_STATE_INIT); + /* set the back pointer to one_easy to assist in removal */ + easy->easy_handle->multi_pos = easy; + /* for multi interface connections, we share DNS cache automatically if the easy handle's one is currently private. */ if (easy->easy_handle->dns.hostcache && @@ -516,13 +519,8 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle, if(!GOOD_EASY_HANDLE(curl_handle)) return CURLM_BAD_EASY_HANDLE; - /* scan through the list and remove the 'curl_handle' */ - easy = multi->easy.next; - while(easy != &multi->easy) { - if(easy->easy_handle == (struct SessionHandle *)curl_handle) - break; - easy=easy->next; - } + /* pick-up from the 'curl_handle' the kept position in the list */ + easy = ((struct SessionHandle *)curl_handle)->multi_pos; if(easy) { bool premature = (bool)(easy->state != CURLM_STATE_COMPLETED); @@ -626,6 +624,9 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle, easy->easy_handle->set.one_easy = NULL; /* detached */ + /* Null the position in the controlling structure */ + easy->easy_handle->multi_pos = NULL; + /* NOTE NOTE NOTE We do not touch the easy handle here! */ if (easy->msg) diff --git a/lib/urldata.h b/lib/urldata.h index 2e13f6046..879f36902 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1342,6 +1342,9 @@ struct SessionHandle { struct Names dns; struct Curl_multi *multi; /* if non-NULL, points to the multi handle struct to which this "belongs" */ + struct Curl_one_easy *multi_pos; /* if non-NULL, points to the its position + in multi controlling structure to assist + in removal. */ struct Curl_share *share; /* Share, handles global variable mutexing */ struct HandleData reqdata; /* Request-specific data */ struct UserDefined set; /* values set by the libcurl user */ |