Robert Iakobashvili made curl_multi_remove_handle() a lot faster when many
easy handles are added to a multi handle, by avoiding the looping over all the handles to find which one to remove.
This commit is contained in:
4
CHANGES
4
CHANGES
@@ -7,6 +7,10 @@
|
|||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
Daniel S (1 April 2007)
|
Daniel S (1 April 2007)
|
||||||
|
- Robert Iakobashvili made curl_multi_remove_handle() a lot faster when many
|
||||||
|
easy handles are added to a multi handle, by avoiding the looping over all
|
||||||
|
the handles to find which one to remove.
|
||||||
|
|
||||||
- Matt Kraai provided a patch that makes curl build on QNX 6 fine again.
|
- Matt Kraai provided a patch that makes curl build on QNX 6 fine again.
|
||||||
|
|
||||||
Daniel S (31 March 2007)
|
Daniel S (31 March 2007)
|
||||||
|
|||||||
15
lib/multi.c
15
lib/multi.c
@@ -413,6 +413,9 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle,
|
|||||||
easy->easy_handle = easy_handle;
|
easy->easy_handle = easy_handle;
|
||||||
multistate(easy, CURLM_STATE_INIT);
|
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
|
/* for multi interface connections, we share DNS cache automatically if the
|
||||||
easy handle's one is currently private. */
|
easy handle's one is currently private. */
|
||||||
if (easy->easy_handle->dns.hostcache &&
|
if (easy->easy_handle->dns.hostcache &&
|
||||||
@@ -516,13 +519,8 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
|||||||
if(!GOOD_EASY_HANDLE(curl_handle))
|
if(!GOOD_EASY_HANDLE(curl_handle))
|
||||||
return CURLM_BAD_EASY_HANDLE;
|
return CURLM_BAD_EASY_HANDLE;
|
||||||
|
|
||||||
/* scan through the list and remove the 'curl_handle' */
|
/* pick-up from the 'curl_handle' the kept position in the list */
|
||||||
easy = multi->easy.next;
|
easy = ((struct SessionHandle *)curl_handle)->multi_pos;
|
||||||
while(easy != &multi->easy) {
|
|
||||||
if(easy->easy_handle == (struct SessionHandle *)curl_handle)
|
|
||||||
break;
|
|
||||||
easy=easy->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(easy) {
|
if(easy) {
|
||||||
bool premature = (bool)(easy->state != CURLM_STATE_COMPLETED);
|
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 */
|
easy->easy_handle->set.one_easy = NULL; /* detached */
|
||||||
|
|
||||||
|
/* Null the position in the controlling structure */
|
||||||
|
easy->easy_handle->multi_pos = NULL;
|
||||||
|
|
||||||
/* NOTE NOTE NOTE
|
/* NOTE NOTE NOTE
|
||||||
We do not touch the easy handle here! */
|
We do not touch the easy handle here! */
|
||||||
if (easy->msg)
|
if (easy->msg)
|
||||||
|
|||||||
@@ -1342,6 +1342,9 @@ struct SessionHandle {
|
|||||||
struct Names dns;
|
struct Names dns;
|
||||||
struct Curl_multi *multi; /* if non-NULL, points to the multi handle
|
struct Curl_multi *multi; /* if non-NULL, points to the multi handle
|
||||||
struct to which this "belongs" */
|
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 Curl_share *share; /* Share, handles global variable mutexing */
|
||||||
struct HandleData reqdata; /* Request-specific data */
|
struct HandleData reqdata; /* Request-specific data */
|
||||||
struct UserDefined set; /* values set by the libcurl user */
|
struct UserDefined set; /* values set by the libcurl user */
|
||||||
|
|||||||
Reference in New Issue
Block a user