[git commit master 1/1] progress meter: move file name to bb_progress_t. +20 bytes

Denys Vlasenko vda.linux at googlemail.com
Fri Feb 11 17:56:13 UTC 2011


commit: http://git.busybox.net/busybox/commit/?id=d55e13964916af6a083be881bffdb493af287c1d
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

We were doing expensive unicode conversion on every update

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 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 c017880..7581cd4 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 1062e9a..1d260dd 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 fcd933f..2a39917 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 d81426e..f2d7daf 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) {
-- 
1.7.3.4



More information about the busybox-cvs mailing list