diff options
author | Olivier Brunel <jjk@jjacky.com> | 2016-08-16 20:32:02 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2016-09-04 13:11:23 +0200 |
commit | 4b86113f5ed66270364738a351ebb5bb23cd0882 (patch) | |
tree | 46e47059805dc88774d9a29e5210c6496e031c37 /lib/progress.h | |
parent | 85e5ebe75f8432333a53832d7acd0ebd65ae2506 (diff) | |
download | curl-4b86113f5ed66270364738a351ebb5bb23cd0882.tar.gz |
speed caps: not based on average speeds anymore
Speed limits (from CURLOPT_MAX_RECV_SPEED_LARGE &
CURLOPT_MAX_SEND_SPEED_LARGE) were applied simply by comparing limits
with the cumulative average speed of the entire transfer; While this
might work at times with good/constant connections, in other cases it
can result to the limits simply being "ignored" for more than "short
bursts" (as told in man page).
Consider a download that goes on much slower than the limit for some
time (because bandwidth is used elsewhere, server is slow, whatever the
reason), then once things get better, curl would simply ignore the limit
up until the average speed (since the beginning of the transfer) reached
the limit. This could prove the limit useless to effectively avoid
using the entire bandwidth (at least for quite some time).
So instead, we now use a "moving starting point" as reference, and every
time at least as much as the limit as been transferred, we can reset
this starting point to the current position. This gets a good limiting
effect that applies to the "current speed" with instant reactivity (in
case of sudden speed burst).
Closes #971
Diffstat (limited to 'lib/progress.h')
-rw-r--r-- | lib/progress.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/progress.h b/lib/progress.h index a77b7ce59..155ff04fe 100644 --- a/lib/progress.h +++ b/lib/progress.h @@ -49,7 +49,11 @@ void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size); int Curl_pgrsUpdate(struct connectdata *); void Curl_pgrsResetTimesSizes(struct Curl_easy *data); void Curl_pgrsTime(struct Curl_easy *data, timerid timer); - +long Curl_pgrsLimitWaitTime(curl_off_t cursize, + curl_off_t startsize, + curl_off_t limit, + struct timeval start, + struct timeval now); /* Don't show progress for sizes smaller than: */ #define LEAST_SIZE_PROGRESS BUFSIZE |