diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2016-04-03 16:55:03 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2016-04-03 16:55:03 +0200 |
commit | 46b494635e6ef54e282749d2c65dd1922b167931 (patch) | |
tree | e6157bc2c346de1d9fdeb4eef958c615f0248961 | |
parent | bc14f4d13d3cf1d43ae809d641e29174662cd1e4 (diff) | |
download | busybox-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.c | 29 |
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"; | |||
20 | void FAST_FUNC bb_verror_msg(const char *s, va_list p, const char* strerr) | 20 | void 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 |