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 /libbb | |
| 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>
Diffstat (limited to 'libbb')
| -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 |
