diff options
author | Daniel Stenberg <daniel@haxx.se> | 2017-12-07 09:29:58 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2017-12-07 17:33:46 +0100 |
commit | b5881d1fbd544576ec876c4374c8f71240965cdc (patch) | |
tree | f5369e29c4296e9433e4529314e35b20ca92cc13 | |
parent | 546e7db78c2c49e5991282d0ba3ff7d5fb1fda30 (diff) |
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.c | 33 |
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; |