From d55e13964916af6a083be881bffdb493af287c1d Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 11 Feb 2011 18:56:13 +0100 Subject: [PATCH] progress meter: move file name to bb_progress_t. +20 bytes We were doing expensive unicode conversion on every update Signed-off-by: Denys Vlasenko --- include/libbb.h | 12 +++++++++--- libbb/progress.c | 24 +++++++++++------------- networking/tftp.c | 10 +++++----- networking/wget.c | 4 ++-- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/include/libbb.h b/include/libbb.h index c0178801f..7581cd4c4 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -1587,15 +1587,21 @@ typedef struct bb_progress_t { off_t lastsize; unsigned lastupdate_sec; unsigned start_sec; - smallint inited; + const char *curfile; } bb_progress_t; -void bb_progress_init(bb_progress_t *p) FAST_FUNC; -void bb_progress_update(bb_progress_t *p, const char *curfile, +#define is_bb_progress_inited(p) ((p)->curfile != NULL) +#define bb_progress_free(p) do { \ + if (ENABLE_UNICODE_SUPPORT) free((char*)((p)->curfile)); \ + (p)->curfile = NULL; \ +} while (0) +void bb_progress_init(bb_progress_t *p, const char *curfile) FAST_FUNC; +void bb_progress_update(bb_progress_t *p, uoff_t beg_range, uoff_t transferred, uoff_t totalsize) FAST_FUNC; + extern const char *applet_name; /* Some older linkers don't perform string merging, we used to have common strings diff --git a/libbb/progress.c b/libbb/progress.c index 1062e9a0d..1d260dd08 100644 --- a/libbb/progress.c +++ b/libbb/progress.c @@ -52,12 +52,17 @@ static unsigned int get_tty2_width(void) return width; } -void FAST_FUNC bb_progress_init(bb_progress_t *p) +void FAST_FUNC bb_progress_init(bb_progress_t *p, const char *curfile) { +#if ENABLE_UNICODE_SUPPORT + init_unicode(); + p->curfile = unicode_conv_to_printable_fixedwidth(/*NULL,*/ curfile, 20); +#else + p->curfile = curfile; +#endif p->start_sec = monotonic_sec(); p->lastupdate_sec = p->start_sec; p->lastsize = 0; - p->inited = 1; } /* File already had beg_size bytes. @@ -68,7 +73,6 @@ void FAST_FUNC bb_progress_init(bb_progress_t *p) * If totalsize == 0, then it is unknown. */ void FAST_FUNC bb_progress_update(bb_progress_t *p, - const char *curfile, uoff_t beg_size, uoff_t transferred, uoff_t totalsize) @@ -130,16 +134,10 @@ 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 - init_unicode(); - { - char *buf = unicode_conv_to_printable_fixedwidth(/*NULL,*/ curfile, 20); - fprintf(stderr, "\r%s%4u%% ", buf, ratio); - free(buf); - } -#else - fprintf(stderr, "\r%-20.20s%4u%% ", curfile, ratio); -#endif + if (ENABLE_UNICODE_SUPPORT) + fprintf(stderr, "\r%s%4u%% ", p->curfile, ratio); + else + fprintf(stderr, "\r%-20.20s%4u%% ", p->curfile, ratio); barlength = get_tty2_width() - 49; if (barlength > 0) { diff --git a/networking/tftp.c b/networking/tftp.c index fcd933f6a..2a3991755 100644 --- a/networking/tftp.c +++ b/networking/tftp.c @@ -107,19 +107,19 @@ struct BUG_G_too_big { #if ENABLE_FEATURE_TFTP_PROGRESS_BAR static void tftp_progress_update(void) { - bb_progress_update(&G.pmt, G.file, 0, G.pos, G.size); + bb_progress_update(&G.pmt, 0, G.pos, G.size); } static void tftp_progress_init(void) { - bb_progress_init(&G.pmt); + bb_progress_init(&G.pmt, G.file); tftp_progress_update(); } static void tftp_progress_done(void) { - if (G.pmt.inited) { + if (is_bb_progress_inited(&G.pmt)) { tftp_progress_update(); bb_putchar_stderr('\n'); - G.pmt.inited = 0; + bb_progress_free(p); } } #else @@ -445,7 +445,7 @@ static int tftp_protocol( #if ENABLE_FEATURE_TFTP_PROGRESS_BAR if (ENABLE_TFTP && remote_file) /* tftp */ G.pos = (block_nr - 1) * (uoff_t)blksize; - if (G.pmt.inited) + if (is_bb_progress_inited(&G.pmt)) tftp_progress_update(); #endif /* Was it final ACK? then exit */ diff --git a/networking/wget.c b/networking/wget.c index d81426e8d..f2d7daf2f 100644 --- a/networking/wget.c +++ b/networking/wget.c @@ -81,9 +81,9 @@ static void progress_meter(int flag) return; if (flag == PROGRESS_START) - bb_progress_init(&G.pmt); + bb_progress_init(&G.pmt, G.curfile); - bb_progress_update(&G.pmt, G.curfile, G.beg_range, G.transferred, + bb_progress_update(&G.pmt, G.beg_range, G.transferred, G.chunked ? 0 : G.beg_range + G.transferred + G.content_len); if (flag == PROGRESS_END) {