summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2017-12-07 09:29:58 +0100
committerDaniel Stenberg <daniel@haxx.se>2017-12-07 17:33:46 +0100
commitb5881d1fbd544576ec876c4374c8f71240965cdc (patch)
treef5369e29c4296e9433e4529314e35b20ca92cc13
parent546e7db78c2c49e5991282d0ba3ff7d5fb1fda30 (diff)
downloadcurl-b5881d1fbd544576ec876c4374c8f71240965cdc.tar.gz
curl: limit -# update frequency for unknown total size
Make it use a max 10Hz update frequency for this case as well. Return early if the "point" hasn't moved since last invoke. Reported-by: Elliot Saba Fixes #2158 Closes #2163
-rw-r--r--src/tool_cb_prg.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/tool_cb_prg.c b/src/tool_cb_prg.c
index 992b96d97..403de03a9 100644
--- a/src/tool_cb_prg.c
+++ b/src/tool_cb_prg.c
@@ -61,14 +61,27 @@ int tool_progress_cb(void *clientp,
/* we've come this far */
point = dlnow + ulnow + bar->initial_size;
- if(bar->calls && (tvdiff(now, bar->prevtime) < 100L) && point < total)
- /* after first call, limit progress-bar updating to 10 Hz */
- /* update when we're at 100% even if last update is less than 200ms ago */
- return 0;
-
- if(point > total)
- /* we have got more than the expected total! */
- total = point;
+ if(bar->calls) {
+ /* after first call... */
+ if(total) {
+ /* we know the total data to get... */
+ if(bar->prev == point)
+ /* progress didn't change since last invoke */
+ return 0;
+ else if((tvdiff(now, bar->prevtime) < 100L) && point < total)
+ /* limit progress-bar updating to 10 Hz except when we're at 100% */
+ return 0;
+ }
+ else {
+ /* total is unknown */
+ if(bar->prev/1024 == point/1024)
+ /* the same kilobyte level as last invoke */
+ return 0;
+ else if(tvdiff(now, bar->prevtime) < 100L)
+ /* limit progress-bar updating to 10 Hz */
+ return 0;
+ }
+ }
/* simply count invokes */
bar->calls++;
@@ -82,6 +95,10 @@ int tool_progress_cb(void *clientp,
}
}
else if(point != bar->prev) {
+ if(point > total)
+ /* we have got more than the expected total! */
+ total = point;
+
frac = (double)point / (double)total;
percent = frac * 100.0;
barwidth = bar->width - 7;