curl: add --parallel-immediate

Starting with this change when doing parallel transfers, without this
option set, curl will prefer to create new transfers multiplexed on an
existing connection rather than creating a brand new one.

--parallel-immediate can be set to tell curl to prefer to use new
connections rather than to wait and try to multiplex.

libcurl-wise, this means that curl will set CURLOPT_PIPEWAIT by default
on parallel transfers.

Suggested-by: Tom van der Woerdt
Closes #4500
This commit is contained in:
Daniel Stenberg 2019-10-17 10:05:53 +02:00
parent 8487734e8b
commit 215baa74f7
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
6 changed files with 22 additions and 1 deletions

View file

@ -300,6 +300,7 @@ struct GlobalConfig {
#endif
bool parallel;
long parallel_max;
bool parallel_connect;
struct OperationConfig *first;
struct OperationConfig *current;
struct OperationConfig *last; /* Always last in the struct */

View file

@ -321,6 +321,7 @@ static const struct LongShort aliases[]= {
{"z", "time-cond", ARG_STRING},
{"Z", "parallel", ARG_BOOL},
{"Zb", "parallel-max", ARG_STRING},
{"Zc", "parallel-immediate", ARG_BOOL},
{"#", "progress-bar", ARG_BOOL},
{"#m", "progress-meter", ARG_BOOL},
{":", "next", ARG_NONE},
@ -2154,6 +2155,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
(global->parallel_max < 1))
global->parallel_max = PARALLEL_DEFAULT;
break;
case 'c': /* --parallel-connect */
global->parallel_connect = toggle;
break;
}
break;
case 'z': /* time condition coming up */

View file

@ -279,6 +279,8 @@ static const struct helptxt helptext[] = {
"Write to file instead of stdout"},
{"-Z, --parallel",
"Perform transfers in parallel"},
{" --parallel-immediate",
"Do not wait for multiplexing (with --parallel)"},
{" --parallel-max",
"Maximum concurrency for parallel transfers"},
{" --pass <phrase>",

View file

@ -1976,6 +1976,10 @@ static CURLcode add_parallel_transfers(struct GlobalConfig *global,
if(result)
break;
/* parallel connect means that we don't set PIPEWAIT since pipewait
will make libcurl prefer multiplexing */
(void)curl_easy_setopt(per->curl, CURLOPT_PIPEWAIT,
global->parallel_connect ? 0L : 1L);
(void)curl_easy_setopt(per->curl, CURLOPT_PRIVATE, per);
(void)curl_easy_setopt(per->curl, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
(void)curl_easy_setopt(per->curl, CURLOPT_XFERINFODATA, per);