]> granicus.if.org Git - curl/commitdiff
process_pending_handles: mark queued transfers as previously pending
authorDaniel Stenberg <daniel@haxx.se>
Tue, 30 Apr 2019 09:12:12 +0000 (11:12 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 1 May 2019 20:51:23 +0000 (22:51 +0200)
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.

lib/multi.c
lib/urldata.h

index 48dadd83b71edf4301219369c922db31518dbc27..2d83e734ea4e51df5b97c44adfc8783b07658a2f 100644 (file)
@@ -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;
   }
 }
 
index 4b09f24fdbc2802063528843fde8e1af26b36cdf..344cc472e5568edda889ec53b5babd90b29e3bac 100644 (file)
@@ -1363,6 +1363,7 @@ struct UrlState {
                   when multi_done() is called, to prevent multi_done() to get
                   invoked twice when the multi interface is used. */
   bit stream_depends_e:1; /* set or don't set the Exclusive bit */
+  bit previouslypending:1; /* this transfer WAS in the multi->pending queue */
 };