summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2019-09-10 14:24:59 +0200
committerDaniel Stenberg <daniel@haxx.se>2019-09-10 14:24:59 +0200
commit63df8e42b81455d09a367be32534d60b74485854 (patch)
treee365609cf1dc05ea24f4a236c469b7d7f5bb10c3
parentc466c3a04b39389e5192932e4f5a93dc6a395a78 (diff)
downloadcurl-bagder/parallel-do-all.tar.gz
fixup parallel_transfers to handle the last added transfers toobagder/parallel-do-all
-rw-r--r--src/tool_operate.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 61f481911..d2ad9642d 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -1926,15 +1926,19 @@ static long all_added; /* number of easy handles currently added */
/*
* add_parallel_transfers() sets 'morep' to TRUE if there are more transfers
- * to add even after this call returns.
+ * to add even after this call returns. sets 'addedp' to TRUE if one or more
+ * transfers were added.
*/
static int add_parallel_transfers(struct GlobalConfig *global,
CURLM *multi,
- bool *morep)
+ bool *morep,
+ bool *addedp)
{
struct per_transfer *per;
CURLcode result;
CURLMcode mcode;
+ *addedp = FALSE;
+ *morep = FALSE;
for(per = transfers; per && (all_added < global->parallel_max);
per = per->next) {
if(per->added)
@@ -1954,6 +1958,7 @@ static int add_parallel_transfers(struct GlobalConfig *global,
return CURLE_OUT_OF_MEMORY;
per->added = TRUE;
all_added++;
+ *addedp = TRUE;
}
*morep = per ? TRUE : FALSE;
return CURLE_OK;
@@ -1969,12 +1974,14 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
int still_running = 1;
struct timeval start = tvnow();
bool more_transfers;
+ bool added_transfers;
multi = curl_multi_init();
if(!multi)
return CURLE_OUT_OF_MEMORY;
- result = add_parallel_transfers(global, multi, &more_transfers);
+ result = add_parallel_transfers(global, multi,
+ &more_transfers, &added_transfers);
if(result)
return result;
@@ -2008,9 +2015,14 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
(void)del_transfer(ended);
}
} while(msg);
- if(removed)
+ if(removed) {
/* one or more transfers completed, add more! */
- (void)add_parallel_transfers(global, multi, &more_transfers);
+ (void)add_parallel_transfers(global, multi, &more_transfers,
+ &added_transfers);
+ if(added_transfers)
+ /* we added new ones, make sure the loop doesn't exit yet */
+ still_running = 1;
+ }
}
}