]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/log.c
Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
[pulseaudio] / src / pulsecore / log.c
index d4d3b76ebafdeb97798e54b80bccbc25c8c6b660..8c21ee6cc4541fbfaaa1b82461560e218609a304 100644 (file)
@@ -38,6 +38,7 @@
 #include <syslog.h>
 #endif
 
+#include <pulse/rtclock.h>
 #include <pulse/utf8.h>
 #include <pulse/xmalloc.h>
 #include <pulse/util.h>
@@ -45,7 +46,7 @@
 
 #include <pulsecore/macro.h>
 #include <pulsecore/core-util.h>
-#include <pulsecore/rtclock.h>
+#include <pulsecore/core-rtclock.h>
 #include <pulsecore/once.h>
 #include <pulsecore/ratelimit.h>
 
 #define ENV_LOG_PRINT_META "PULSE_LOG_META"
 #define ENV_LOG_PRINT_LEVEL "PULSE_LOG_LEVEL"
 #define ENV_LOG_BACKTRACE "PULSE_LOG_BACKTRACE"
+#define ENV_LOG_BACKTRACE_SKIP "PULSE_LOG_BACKTRACE_SKIP"
 
 static char *ident = NULL; /* in local charset format */
 static pa_log_target_t target = PA_LOG_STDERR, target_override;
 static pa_bool_t target_override_set = FALSE;
 static pa_log_level_t maximum_level = PA_LOG_ERROR, maximum_level_override = PA_LOG_ERROR;
-static unsigned show_backtrace = 0, show_backtrace_override = 0;
+static unsigned show_backtrace = 0, show_backtrace_override = 0, skip_backtrace = 0;
 static pa_log_flags_t flags = 0, flags_override = 0;
 
 #ifdef HAVE_SYSLOG_H
@@ -128,13 +130,17 @@ void pa_log_set_show_backtrace(unsigned nlevels) {
     show_backtrace = nlevels;
 }
 
+void pa_log_set_skip_backtrace(unsigned nlevels) {
+    skip_backtrace = nlevels;
+}
+
 #ifdef HAVE_EXECINFO_H
 
 static char* get_backtrace(unsigned show_nframes) {
     void* trace[32];
     int n_frames;
     char **symbols, *e, *r;
-    unsigned j, n;
+    unsigned j, n, s;
     size_t a;
 
     pa_assert(show_nframes > 0);
@@ -149,14 +155,15 @@ static char* get_backtrace(unsigned show_nframes) {
     if (!symbols)
         return NULL;
 
-    n = PA_MIN((unsigned) n_frames, show_nframes);
+    s = skip_backtrace;
+    n = PA_MIN((unsigned) n_frames, s + show_nframes);
 
     a = 4;
 
-    for (j = 0; j < n; j++) {
-        if (j > 0)
+    for (j = s; j < n; j++) {
+        if (j > s)
             a += 2;
-        a += strlen(symbols[j]);
+        a += strlen(pa_path_get_filename(symbols[j]));
     }
 
     r = pa_xnew(char, a);
@@ -164,14 +171,18 @@ static char* get_backtrace(unsigned show_nframes) {
     strcpy(r, " (");
     e = r + 2;
 
-    for (j = 0; j < n; j++) {
-        if (j > 0) {
+    for (j = s; j < n; j++) {
+        const char *sym;
+
+        if (j > s) {
             strcpy(e, "<<");
             e += 2;
         }
 
-        strcpy(e, symbols[j]);
-        e += strlen(symbols[j]);
+        sym = pa_path_get_filename(symbols[j]);
+
+        strcpy(e, sym);
+        e += strlen(sym);
     }
 
     strcpy(e, ")");
@@ -225,6 +236,13 @@ static void init_defaults(void) {
         if (show_backtrace_override <= 0)
             show_backtrace_override = 0;
     }
+
+    if ((e = getenv(ENV_LOG_BACKTRACE_SKIP))) {
+        skip_backtrace = (unsigned) atoi(e);
+
+        if (skip_backtrace <= 0)
+            skip_backtrace = 0;
+    }
 }
 
 void pa_log_levelv_meta(
@@ -245,7 +263,7 @@ void pa_log_levelv_meta(
 
     /* We don't use dynamic memory allocation here to minimize the hit
      * in RT threads */
-    char text[4096], location[128], timestamp[32];
+    char text[16*1024], location[128], timestamp[32];
 
     pa_assert(level < PA_LOG_LEVEL_MAX);
     pa_assert(format);
@@ -268,7 +286,7 @@ void pa_log_levelv_meta(
 
     if ((_flags & PA_LOG_PRINT_META) && file && line > 0 && func)
         pa_snprintf(location, sizeof(location), "[%s:%i %s()] ", file, line, func);
-    else if (_flags & (PA_LOG_PRINT_META|PA_LOG_PRINT_FILE))
+    else if ((_flags & (PA_LOG_PRINT_META|PA_LOG_PRINT_FILE)) && file)
         pa_snprintf(location, sizeof(location), "%s: ", pa_path_get_filename(file));
     else
         location[0] = 0;
@@ -277,7 +295,7 @@ void pa_log_levelv_meta(
         static pa_usec_t start, last;
         pa_usec_t u, a, r;
 
-        u = pa_rtclock_usec();
+        u = pa_rtclock_now();
 
         PA_ONCE_BEGIN {
             start = u;
@@ -306,7 +324,7 @@ void pa_log_levelv_meta(
 #endif
 
     if (!pa_utf8_valid(text))
-        pa_log_level(level, __FILE__": invalid UTF-8 string following below:");
+        pa_logl(level, "Invalid UTF-8 string following below:");
 
     for (t = text; t; t = n) {
         if ((n = strchr(t, '\n'))) {