aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2016-04-03 16:55:03 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2016-04-03 16:55:03 +0200
commit46b494635e6ef54e282749d2c65dd1922b167931 (patch)
treee6157bc2c346de1d9fdeb4eef958c615f0248961
parentbc14f4d13d3cf1d43ae809d641e29174662cd1e4 (diff)
downloadbusybox-w32-46b494635e6ef54e282749d2c65dd1922b167931.tar.gz
busybox-w32-46b494635e6ef54e282749d2c65dd1922b167931.tar.bz2
busybox-w32-46b494635e6ef54e282749d2c65dd1922b167931.zip
libbb: speed up error_msg functions
function old new delta bb_verror_msg 386 466 +80 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/verror_msg.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/libbb/verror_msg.c b/libbb/verror_msg.c
index 0ef2a311f..22c30357b 100644
--- a/libbb/verror_msg.c
+++ b/libbb/verror_msg.c
@@ -20,6 +20,7 @@ const char *msg_eol = "\n";
20void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr) 20void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr)
21{ 21{
22 char *msg, *msg1; 22 char *msg, *msg1;
23 char stack_msg[80];
23 int applet_len, strerr_len, msgeol_len, used; 24 int applet_len, strerr_len, msgeol_len, used;
24 25
25 if (!logmode) 26 if (!logmode)
@@ -28,6 +29,27 @@ void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr)
28 if (!s) /* nomsg[_and_die] uses NULL fmt */ 29 if (!s) /* nomsg[_and_die] uses NULL fmt */
29 s = ""; /* some libc don't like printf(NULL) */ 30 s = ""; /* some libc don't like printf(NULL) */
30 31
32 applet_len = strlen(applet_name) + 2; /* "applet: " */
33 strerr_len = strerr ? strlen(strerr) : 0;
34 msgeol_len = strlen(msg_eol);
35
36 /* This costs ~90 bytes of code, but avoids costly
37 * malloc()[in vasprintf]+realloc()+memmove()+free() in 99% of cases.
38 * ~40% speedup.
39 */
40 if ((int)sizeof(stack_msg) - applet_len > 0) {
41 va_list p2;
42
43 /* It is not portable to use va_list twice, need to va_copy it */
44 va_copy(p2, p);
45 used = vsnprintf(stack_msg + applet_len, (int)sizeof(stack_msg) - applet_len, s, p2);
46 va_end(p2);
47 msg = stack_msg;
48 used += applet_len;
49 if (used < (int)sizeof(stack_msg) - 3 - msgeol_len - strerr_len)
50 goto add_pfx_and_sfx;
51 }
52
31 used = vasprintf(&msg, s, p); 53 used = vasprintf(&msg, s, p);
32 if (used < 0) 54 if (used < 0)
33 return; 55 return;
@@ -37,9 +59,6 @@ void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr)
37 * This is needed for e.g. httpd logging, when multiple 59 * This is needed for e.g. httpd logging, when multiple
38 * children can produce log messages simultaneously. */ 60 * children can produce log messages simultaneously. */
39 61
40 applet_len = strlen(applet_name) + 2; /* "applet: " */
41 strerr_len = strerr ? strlen(strerr) : 0;
42 msgeol_len = strlen(msg_eol);
43 /* can't use xrealloc: it calls error_msg on failure, 62 /* can't use xrealloc: it calls error_msg on failure,
44 * that may result in a recursion */ 63 * that may result in a recursion */
45 /* +3 is for ": " before strerr and for terminating NUL */ 64 /* +3 is for ": " before strerr and for terminating NUL */
@@ -52,6 +71,7 @@ void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr)
52 /* TODO: maybe use writev instead of memmoving? Need full_writev? */ 71 /* TODO: maybe use writev instead of memmoving? Need full_writev? */
53 memmove(msg + applet_len, msg, used); 72 memmove(msg + applet_len, msg, used);
54 used += applet_len; 73 used += applet_len;
74 add_pfx_and_sfx:
55 strcpy(msg, applet_name); 75 strcpy(msg, applet_name);
56 msg[applet_len - 2] = ':'; 76 msg[applet_len - 2] = ':';
57 msg[applet_len - 1] = ' '; 77 msg[applet_len - 1] = ' ';
@@ -76,7 +96,8 @@ void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr)
76 syslog(syslog_level, "%s", msg + applet_len); 96 syslog(syslog_level, "%s", msg + applet_len);
77 } 97 }
78#endif 98#endif
79 free(msg); 99 if (msg != stack_msg)
100 free(msg);
80} 101}
81 102
82#ifdef VERSION_WITH_WRITEV 103#ifdef VERSION_WITH_WRITEV