summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-02-11 18:09:30 (GMT)
committer Denys Vlasenko <vda.linux@googlemail.com>2011-02-11 18:09:30 (GMT)
commitab8d00d64fc23602875952c08c030f05f206686c (patch)
tree62832c02ad648d25a9395f26d59220ba932b8f88
parentd55e13964916af6a083be881bffdb493af287c1d (diff)
downloadbusybox-ab8d00d64fc23602875952c08c030f05f206686c.tar.gz
busybox-ab8d00d64fc23602875952c08c030f05f206686c.tar.bz2
progress meter: fix bugs found in stall detection and unknown size logic
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--include/libbb.h5
-rw-r--r--libbb/progress.c55
-rw-r--r--networking/tftp.c2
3 files changed, 36 insertions, 26 deletions
diff --git a/include/libbb.h b/include/libbb.h
index 7581cd4..65c3194 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 1d260dd..df43dad 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,
}
}
- beg_and_transferred = beg_size + transferred;
-
- ratio = 100 * beg_and_transferred / totalsize;
if (ENABLE_UNICODE_SUPPORT)
- fprintf(stderr, "\r%s%4u%% ", p->curfile, ratio);
+ fprintf(stderr, "\r%s", p->curfile);
else
- fprintf(stderr, "\r%-20.20s%4u%% ", p->curfile, 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);
+ fprintf(stderr, "\r%-20.20s", p->curfile);
+
+ beg_and_transferred = beg_size + transferred;
+
+ 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);
+ }
}
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 2a39917..35cf0db 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