diff options
Diffstat (limited to 'src/pulsecore/log.c')
-rw-r--r-- | src/pulsecore/log.c | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c index 53f8974c..5eda4f65 100644 --- a/src/pulsecore/log.c +++ b/src/pulsecore/log.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of PulseAudio. @@ -30,6 +28,7 @@ #include <stdio.h> #include <unistd.h> #include <string.h> +#include <errno.h> #ifdef HAVE_SYSLOG_H #include <syslog.h> @@ -80,7 +79,7 @@ void pa_log_set_ident(const char *p) { } /* To make valgrind shut up. */ -static void ident_destructor(void) PA_GCC_DESTRUCTOR; +static void ident_destructor(void) PA_GCC_DESTRUCTOR; static void ident_destructor(void) { pa_xfree(log_ident); pa_xfree(log_ident_local); @@ -88,13 +87,13 @@ static void ident_destructor(void) { void pa_log_set_maximal_level(pa_log_level_t l) { pa_assert(l < PA_LOG_LEVEL_MAX); - + maximal_level = l; } void pa_log_set_target(pa_log_target_t t, void (*func)(pa_log_level_t l, const char*s)) { pa_assert(t == PA_LOG_USER || !func); - + log_target = t; user_log_func = func; } @@ -108,7 +107,12 @@ void pa_log_levelv_meta( va_list ap) { const char *e; - char *text, *t, *n, *location; + char *t, *n; + int saved_errno = errno; + + /* We don't use dynamic memory allocation here to minimize the hit + * in RT threads */ + char text[1024], location[128]; pa_assert(level < PA_LOG_LEVEL_MAX); pa_assert(format); @@ -116,17 +120,19 @@ void pa_log_levelv_meta( if ((e = getenv(ENV_LOGLEVEL))) maximal_level = atoi(e); - if (level > maximal_level) + if (level > maximal_level) { + errno = saved_errno; return; + } - text = pa_vsprintf_malloc(format, ap); + pa_vsnprintf(text, sizeof(text), format, ap); if (getenv(ENV_LOGMETA) && file && line > 0 && func) - location = pa_sprintf_malloc("[%s:%i %s()] ", file, line, func); + pa_snprintf(location, sizeof(location), "[%s:%i %s()] ", file, line, func); else if (file) - location = pa_sprintf_malloc("%s: ", pa_path_get_filename(file)); + pa_snprintf(location, sizeof(location), "%s: ", pa_path_get_filename(file)); else - location = pa_xstrdup(""); + location[0] = 0; if (!pa_utf8_valid(text)) pa_log_level(level, __FILE__": invalid UTF-8 string following below:"); @@ -158,6 +164,8 @@ void pa_log_levelv_meta( } #endif + /* We shouldn't be using dynamic allocation here to + * minimize the hit in RT threads */ local_t = pa_utf8_to_locale(t); if (!local_t) fprintf(stderr, "%c: %s%s%s%s\n", level_to_char[level], location, prefix, t, suffix); @@ -189,11 +197,10 @@ void pa_log_levelv_meta( #endif case PA_LOG_USER: { - char *x; + char x[1024]; - x = pa_sprintf_malloc("%s%s", location, t); + pa_snprintf(x, sizeof(x), "%s%s", location, t); user_log_func(level, x); - pa_xfree(x); break; } @@ -204,8 +211,7 @@ void pa_log_levelv_meta( } } - pa_xfree(text); - pa_xfree(location); + errno = saved_errno; } void pa_log_level_meta( @@ -227,7 +233,7 @@ void pa_log_levelv(pa_log_level_t level, const char *format, va_list ap) { void pa_log_level(pa_log_level_t level, const char *format, ...) { va_list ap; - + va_start(ap, format); pa_log_levelv_meta(level, NULL, 0, NULL, format, ap); va_end(ap); |