summaryrefslogtreecommitdiff
path: root/lib/multi.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2019-04-30 11:12:12 +0200
committerDaniel Stenberg <daniel@haxx.se>2019-05-01 22:51:23 +0200
commit5c8783d77f341d69e866bf0cd56836b4faea0a1f (patch)
treeb96d322e0a7ccdf7ac84a18b16550cb067887b04 /lib/multi.c
parentc32248f17d6d79de19aff60061ec8c2adf82f177 (diff)
downloadcurl-5c8783d77f341d69e866bf0cd56836b4faea0a1f.tar.gz
process_pending_handles: mark queued transfers as previously pending
With transfers being queued up, we only move one at a a time back to the CONNECT state but now we mark moved transfers so that when a moved transfer is confirmed "successful" (it connected) it will trigger the move of another pending transfer. Previously, it would otherwise wait until the transfer was done before doing this. This makes queued up pending transfers get processed (much) faster.
Diffstat (limited to 'lib/multi.c')
-rw-r--r--lib/multi.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/multi.c b/lib/multi.c
index 48dadd83b..2d83e734e 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1365,6 +1365,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
result = CURLE_OK;
break;
}
+ else if(data->state.previouslypending) {
+ /* this transfer comes from the pending queue so try move another */
+ infof(data, "Transfer was pending, now try another\n");
+ process_pending_handles(data->multi);
+ }
if(!result) {
if(async)
@@ -2991,6 +2996,9 @@ static void process_pending_handles(struct Curl_multi *multi)
/* Make sure that the handle will be processed soonish. */
Curl_expire(data, 0, EXPIRE_RUN_NOW);
+
+ /* mark this as having been in the pending queue */
+ data->state.previouslypending = TRUE;
}
}