mirror of
https://github.com/moparisthebest/curl
synced 2024-11-16 06:25:03 -05:00
easy_perform: use *multi_timeout() to get wait times
... and trim the threaded Curl_resolver_getsock() to return zero millisecond wait times during the first three milliseconds so that localhost or names in the OS resolver cache gets detected and used faster. Closes #2685
This commit is contained in:
parent
b0a365f8a0
commit
3ef67c6861
@ -574,10 +574,10 @@ int Curl_resolver_getsock(struct connectdata *conn,
|
|||||||
(void)socks;
|
(void)socks;
|
||||||
(void)numsocks;
|
(void)numsocks;
|
||||||
ms = Curl_timediff(Curl_now(), reslv->start);
|
ms = Curl_timediff(Curl_now(), reslv->start);
|
||||||
if(ms < 10)
|
if(ms < 3)
|
||||||
milli = ms/3;
|
milli = 0;
|
||||||
else if(ms <= 50)
|
else if(ms <= 50)
|
||||||
milli = 10;
|
milli = ms/3;
|
||||||
else if(ms <= 250)
|
else if(ms <= 250)
|
||||||
milli = 50;
|
milli = 50;
|
||||||
else
|
else
|
||||||
|
23
lib/easy.c
23
lib/easy.c
@ -661,38 +661,27 @@ static CURLcode easy_transfer(struct Curl_multi *multi)
|
|||||||
bool done = FALSE;
|
bool done = FALSE;
|
||||||
CURLMcode mcode = CURLM_OK;
|
CURLMcode mcode = CURLM_OK;
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
struct curltime before;
|
|
||||||
int without_fds = 0; /* count number of consecutive returns from
|
|
||||||
curl_multi_wait() without any filedescriptors */
|
|
||||||
|
|
||||||
while(!done && !mcode) {
|
while(!done && !mcode) {
|
||||||
int still_running = 0;
|
int still_running = 0;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
before = Curl_now();
|
|
||||||
mcode = curl_multi_wait(multi, NULL, 0, 1000, &rc);
|
mcode = curl_multi_wait(multi, NULL, 0, 1000, &rc);
|
||||||
|
|
||||||
if(!mcode) {
|
if(!mcode) {
|
||||||
if(!rc) {
|
if(!rc) {
|
||||||
struct curltime after = Curl_now();
|
long sleep_ms;
|
||||||
|
|
||||||
/* If it returns without any filedescriptor instantly, we need to
|
/* If it returns without any filedescriptor instantly, we need to
|
||||||
avoid busy-looping during periods where it has nothing particular
|
avoid busy-looping during periods where it has nothing particular
|
||||||
to wait for */
|
to wait for */
|
||||||
if(Curl_timediff(after, before) <= 10) {
|
curl_multi_timeout(multi, &sleep_ms);
|
||||||
without_fds++;
|
if(sleep_ms) {
|
||||||
if(without_fds > 2) {
|
if(sleep_ms > 1000)
|
||||||
int sleep_ms = without_fds < 10 ? (1 << (without_fds - 1)) : 1000;
|
sleep_ms = 1000;
|
||||||
Curl_wait_ms(sleep_ms);
|
Curl_wait_ms((int)sleep_ms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
/* it wasn't "instant", restart counter */
|
|
||||||
without_fds = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
/* got file descriptor, restart counter */
|
|
||||||
without_fds = 0;
|
|
||||||
|
|
||||||
mcode = curl_multi_perform(multi, &still_running);
|
mcode = curl_multi_perform(multi, &still_running);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user