progress meter: move file name to bb_progress_t. +20 bytes
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 11 Feb 2011 17:56:13 +0000 (18:56 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 11 Feb 2011 17:56:13 +0000 (18:56 +0100)
We were doing expensive unicode conversion on every update

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
include/libbb.h
libbb/progress.c
networking/tftp.c
networking/wget.c

index c0178801fb0e4ebb54a264467ab434a677db6e8f..7581cd4c4844e67d42e038bca0ac292850affcb4 100644 (file)
@@ -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
index 1062e9a0d02e163e0b53c90b2b6cc6a85f77607d..1d260dd086e20f8c24b9ba24144d5f19a044a46b 100644 (file)
@@ -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) {
index fcd933f6ad76adcd416b347faa6fa6eb3a7032b1..2a3991755691bdc1acec70e37fbe4eb5eeed32ff 100644 (file)
@@ -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 */
index d81426e8d9bdb6f4c5b11f5eaed1a2ac4800c75c..f2d7daf2f886ce99bb472710c3ac5b5029f97d85 100644 (file)
@@ -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) {