From ab8d00d64fc23602875952c08c030f05f206686c Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 11 Feb 2011 19:09:30 +0100 Subject: [PATCH] progress meter: fix bugs found in stall detection and unknown size logic Signed-off-by: Denys Vlasenko --- include/libbb.h | 5 +++-- libbb/progress.c | 53 +++++++++++++++++++++++++++-------------------- networking/tftp.c | 2 +- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/include/libbb.h b/include/libbb.h index 7581cd4c4..65c319402 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -1584,8 +1584,9 @@ int print_flags_separated(const int *masks, const char *labels, int print_flags(const masks_labels_t *ml, int flags) FAST_FUNC; typedef struct bb_progress_t { - off_t lastsize; - unsigned lastupdate_sec; + unsigned last_size; + unsigned last_update_sec; + unsigned last_change_sec; unsigned start_sec; const char *curfile; } bb_progress_t; diff --git a/libbb/progress.c b/libbb/progress.c index 1d260dd08..df43dad5c 100644 --- a/libbb/progress.c +++ b/libbb/progress.c @@ -61,8 +61,9 @@ void FAST_FUNC bb_progress_init(bb_progress_t *p, const char *curfile) p->curfile = curfile; #endif p->start_sec = monotonic_sec(); - p->lastupdate_sec = p->start_sec; - p->lastsize = 0; + p->last_update_sec = p->start_sec; + p->last_change_sec = p->start_sec; + p->last_size = 0; } /* File already had beg_size bytes. @@ -79,12 +80,15 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p, { uoff_t beg_and_transferred; unsigned since_last_update, elapsed; - unsigned ratio; int barlength; int kiloscale; + //transferred = 1234; /* use for stall detection testing */ + //totalsize = 0; /* use for unknown size download testing */ + elapsed = monotonic_sec(); - since_last_update = elapsed - p->lastupdate_sec; + since_last_update = elapsed - p->last_update_sec; + p->last_update_sec = elapsed; if (totalsize != 0 && transferred >= totalsize - beg_size) { /* Last call. Do not skip this update */ @@ -131,23 +135,27 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p, } } + if (ENABLE_UNICODE_SUPPORT) + fprintf(stderr, "\r%s", p->curfile); + else + fprintf(stderr, "\r%-20.20s", p->curfile); + beg_and_transferred = beg_size + transferred; - ratio = 100 * beg_and_transferred / totalsize; - if (ENABLE_UNICODE_SUPPORT) - fprintf(stderr, "\r%s%4u%% ", p->curfile, ratio); - else - fprintf(stderr, "\r%-20.20s%4u%% ", p->curfile, ratio); + if (totalsize != 0) { + unsigned ratio = 100 * beg_and_transferred / totalsize; + fprintf(stderr, "%4u%%", ratio); - barlength = get_tty2_width() - 49; - if (barlength > 0) { - /* god bless gcc for variable arrays :) */ - char buf[barlength + 1]; - unsigned stars = (unsigned)barlength * beg_and_transferred / totalsize; - memset(buf, ' ', barlength); - buf[barlength] = '\0'; - memset(buf, '*', stars); - fprintf(stderr, "|%s|", buf); + barlength = get_tty2_width() - 49; + if (barlength > 0) { + /* god bless gcc for variable arrays :) */ + char buf[barlength + 1]; + unsigned stars = (unsigned)barlength * beg_and_transferred / totalsize; + memset(buf, ' ', barlength); + buf[barlength] = '\0'; + memset(buf, '*', stars); + fprintf(stderr, " |%s|", buf); + } } while (beg_and_transferred >= 100000) { @@ -158,9 +166,10 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p, fprintf(stderr, "%6u%c", (unsigned)beg_and_transferred, " kMGTPEZY"[kiloscale]); #define beg_and_transferred dont_use_beg_and_transferred_below() - if (transferred != p->lastsize) { - p->lastupdate_sec = elapsed; - p->lastsize = transferred; + since_last_update = elapsed - p->last_change_sec; + if ((unsigned)transferred != p->last_size) { + p->last_change_sec = elapsed; + p->last_size = (unsigned)transferred; if (since_last_update >= STALLTIME) { /* We "cut out" these seconds from elapsed time * by adjusting start time */ @@ -173,7 +182,7 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p, if (since_last_update >= STALLTIME) { fprintf(stderr, " - stalled -"); - } else if (!totalsize || !transferred || (int)elapsed <= 0) { + } else if (!totalsize || !transferred || (int)elapsed < 0) { fprintf(stderr, " --:--:-- ETA"); } else { unsigned eta, secs, hours; diff --git a/networking/tftp.c b/networking/tftp.c index 2a3991755..35cf0dbd9 100644 --- a/networking/tftp.c +++ b/networking/tftp.c @@ -119,7 +119,7 @@ static void tftp_progress_done(void) if (is_bb_progress_inited(&G.pmt)) { tftp_progress_update(); bb_putchar_stderr('\n'); - bb_progress_free(p); + bb_progress_free(&G.pmt); } } #else