[pulseaudio-discuss] [PATCH] add log category

Deng Zhengrong dzrongg at gmail.com
Thu May 24 06:46:40 PDT 2012


---
 src/modules/module-loopback.c  |    5 ++
 src/pulse/channelmap.c         |    2 +
 src/pulse/client-conf.c        |    2 +
 src/pulse/context.c            |    2 +
 src/pulse/ext-device-manager.c |    2 +
 src/pulse/ext-device-restore.c |    2 +
 src/pulse/ext-stream-restore.c |    2 +
 src/pulse/format.c             |    2 +
 src/pulse/introspect.c         |    2 +
 src/pulse/mainloop-api.c       |    2 +
 src/pulse/mainloop-signal.c    |    2 +
 src/pulse/mainloop.c           |    2 +
 src/pulse/operation.c          |    2 +
 src/pulse/proplist.c           |    2 +
 src/pulse/sample.c             |    2 +
 src/pulse/scache.c             |    2 +
 src/pulse/stream.c             |    2 +
 src/pulse/subscribe.c          |    2 +
 src/pulse/thread-mainloop.c    |    2 +
 src/pulse/timeval.c            |    2 +
 src/pulse/utf8.c               |    2 +
 src/pulse/util.c               |    2 +
 src/pulse/volume.c             |    2 +
 src/pulse/xmalloc.c            |    2 +
 src/pulsecore/authkey.c        |    2 +
 src/pulsecore/conf-parser.c    |    2 +
 src/pulsecore/core-error.c     |    2 +
 src/pulsecore/core-rtclock.c   |    2 +
 src/pulsecore/core-util.c      |    2 +
 src/pulsecore/dynarray.c       |    2 +
 src/pulsecore/flist.c          |    2 +
 src/pulsecore/iochannel.c      |    2 +
 src/pulsecore/ioline.c         |    2 +
 src/pulsecore/ipacl.c          |    2 +
 src/pulsecore/lock-autospawn.c |    2 +
 src/pulsecore/log.c            |  104 ++++++++++++++++++++++++++++++++++++++--
 src/pulsecore/log.h            |   39 +++++++++++----
 src/pulsecore/macro.h          |    2 +-
 src/pulsecore/ratelimit.c      |    2 +
 39 files changed, 205 insertions(+), 15 deletions(-)

diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
index 1a69445..3b9bb90 100644
--- a/src/modules/module-loopback.c
+++ b/src/modules/module-loopback.c
@@ -59,6 +59,9 @@ PA_MODULE_USAGE(
         "sink_dont_move=<boolean> "
         "remix=<remix channels?> ");
 
+PA_LOG_CATEGORY_STATIC(module_loopback_category);
+#define PA_LOG_CATEGORY_DEFAULT module_loopback_category
+
 #define DEFAULT_LATENCY_MSEC 200
 
 #define MEMBLOCKQ_MAXLENGTH (1024*1024*16)
@@ -663,6 +666,8 @@ int pa__init(pa_module *m) {
 
     pa_assert(m);
 
+    PA_LOG_CATEGORY_INIT(module_loopback_category, "loopback", 0);
+
     if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
         pa_log("Failed to parse module arguments");
         goto fail;
diff --git a/src/pulse/channelmap.c b/src/pulse/channelmap.c
index 0d199f3..f375cbf 100644
--- a/src/pulse/channelmap.c
+++ b/src/pulse/channelmap.c
@@ -38,6 +38,8 @@
 
 #include "channelmap.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CHANNELMAP
+
 const char *const table[PA_CHANNEL_POSITION_MAX] = {
     [PA_CHANNEL_POSITION_MONO] = "mono",
 
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index e2c2aae..1801062 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -40,6 +40,8 @@
 
 #include "client-conf.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 #define DEFAULT_CLIENT_CONFIG_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "client.conf"
 #define DEFAULT_CLIENT_CONFIG_FILE_USER "client.conf"
 
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 5bd3448..14520e5 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -71,6 +71,8 @@
 #include "internal.h"
 #include "context.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CONTEXT
+
 void pa_command_extension(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
 
 static const pa_pdispatch_cb_t command_table[PA_COMMAND_MAX] = {
diff --git a/src/pulse/ext-device-manager.c b/src/pulse/ext-device-manager.c
index f2ea63a..2dca36c 100644
--- a/src/pulse/ext-device-manager.c
+++ b/src/pulse/ext-device-manager.c
@@ -35,6 +35,8 @@
 #include "internal.h"
 #include "ext-device-manager.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 enum {
     SUBCOMMAND_TEST,
     SUBCOMMAND_READ,
diff --git a/src/pulse/ext-device-restore.c b/src/pulse/ext-device-restore.c
index 25d33d1..2174d82 100644
--- a/src/pulse/ext-device-restore.c
+++ b/src/pulse/ext-device-restore.c
@@ -37,6 +37,8 @@
 #include "internal.h"
 #include "ext-device-restore.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 /* Protocol extension commands */
 enum {
     SUBCOMMAND_TEST,
diff --git a/src/pulse/ext-stream-restore.c b/src/pulse/ext-stream-restore.c
index 1f72c1c..569bcb0 100644
--- a/src/pulse/ext-stream-restore.c
+++ b/src/pulse/ext-stream-restore.c
@@ -33,6 +33,8 @@
 #include "internal.h"
 #include "ext-stream-restore.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 enum {
     SUBCOMMAND_TEST,
     SUBCOMMAND_READ,
diff --git a/src/pulse/format.c b/src/pulse/format.c
index 542d119..972a6d0 100644
--- a/src/pulse/format.c
+++ b/src/pulse/format.c
@@ -36,6 +36,8 @@
 
 #include "format.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 #define PA_JSON_MIN_KEY "min"
 #define PA_JSON_MAX_KEY "max"
 
diff --git a/src/pulse/introspect.c b/src/pulse/introspect.c
index 38a9d1c..1ec638f 100644
--- a/src/pulse/introspect.c
+++ b/src/pulse/introspect.c
@@ -35,6 +35,8 @@
 #include "internal.h"
 #include "introspect.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 /*** Statistics ***/
 
 static void context_stat_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
diff --git a/src/pulse/mainloop-api.c b/src/pulse/mainloop-api.c
index 45539cc..be76c27 100644
--- a/src/pulse/mainloop-api.c
+++ b/src/pulse/mainloop-api.c
@@ -32,6 +32,8 @@
 
 #include "mainloop-api.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 struct once_info {
     void (*callback)(pa_mainloop_api*m, void *userdata);
     void *userdata;
diff --git a/src/pulse/mainloop-signal.c b/src/pulse/mainloop-signal.c
index 9482fe3..b0a9453 100644
--- a/src/pulse/mainloop-signal.c
+++ b/src/pulse/mainloop-signal.c
@@ -45,6 +45,8 @@
 
 #include "mainloop-signal.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 struct pa_signal_event {
     int sig;
 #ifdef HAVE_SIGACTION
diff --git a/src/pulse/mainloop.c b/src/pulse/mainloop.c
index 5c0345e..7031f8f 100644
--- a/src/pulse/mainloop.c
+++ b/src/pulse/mainloop.c
@@ -51,6 +51,8 @@
 #include "mainloop.h"
 #include "internal.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 struct pa_io_event {
     pa_mainloop *mainloop;
     pa_bool_t dead:1;
diff --git a/src/pulse/operation.c b/src/pulse/operation.c
index fe160a3..f14466d 100644
--- a/src/pulse/operation.c
+++ b/src/pulse/operation.c
@@ -30,6 +30,8 @@
 #include "internal.h"
 #include "operation.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 PA_STATIC_FLIST_DECLARE(operations, 0, pa_xfree);
 
 pa_operation *pa_operation_new(pa_context *c, pa_stream *s, pa_operation_cb_t cb, void *userdata) {
diff --git a/src/pulse/proplist.c b/src/pulse/proplist.c
index 649138c..1296bc8 100644
--- a/src/pulse/proplist.c
+++ b/src/pulse/proplist.c
@@ -35,6 +35,8 @@
 
 #include "proplist.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 struct property {
     char *key;
     void *value;
diff --git a/src/pulse/sample.c b/src/pulse/sample.c
index b613612..5731736 100644
--- a/src/pulse/sample.c
+++ b/src/pulse/sample.c
@@ -35,6 +35,8 @@
 
 #include "sample.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 static const size_t size_table[] = {
     [PA_SAMPLE_U8] = 1,
     [PA_SAMPLE_ULAW] = 1,
diff --git a/src/pulse/scache.c b/src/pulse/scache.c
index 3fad82a..60bc803 100644
--- a/src/pulse/scache.c
+++ b/src/pulse/scache.c
@@ -36,6 +36,8 @@
 #include "internal.h"
 #include "scache.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 int pa_stream_connect_upload(pa_stream *s, size_t length) {
     pa_tagstruct *t;
     uint32_t tag;
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 39338c1..52c9ae4 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -44,6 +44,8 @@
 #include "internal.h"
 #include "stream.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 #define AUTO_TIMING_INTERVAL_START_USEC (10*PA_USEC_PER_MSEC)
 #define AUTO_TIMING_INTERVAL_END_USEC (1500*PA_USEC_PER_MSEC)
 
diff --git a/src/pulse/subscribe.c b/src/pulse/subscribe.c
index a6ad238..4cf002a 100644
--- a/src/pulse/subscribe.c
+++ b/src/pulse/subscribe.c
@@ -31,6 +31,8 @@
 #include "internal.h"
 #include "subscribe.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 void pa_command_subscribe_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
     pa_context *c = userdata;
     pa_subscription_event_type_t e;
diff --git a/src/pulse/thread-mainloop.c b/src/pulse/thread-mainloop.c
index aa56a92..8e822b8 100644
--- a/src/pulse/thread-mainloop.c
+++ b/src/pulse/thread-mainloop.c
@@ -43,6 +43,8 @@
 
 #include "thread-mainloop.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 struct pa_threaded_mainloop {
     pa_mainloop *real_mainloop;
     volatile int n_waiting, n_waiting_for_accept;
diff --git a/src/pulse/timeval.c b/src/pulse/timeval.c
index a394dbe..a993b2b 100644
--- a/src/pulse/timeval.c
+++ b/src/pulse/timeval.c
@@ -36,6 +36,8 @@
 
 #include "timeval.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 struct timeval *pa_gettimeofday(struct timeval *tv) {
     pa_assert(tv);
 
diff --git a/src/pulse/utf8.c b/src/pulse/utf8.c
index 773a1f8..0962515 100644
--- a/src/pulse/utf8.c
+++ b/src/pulse/utf8.c
@@ -62,6 +62,8 @@
 
 #include "utf8.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 #define FILTER_CHAR '_'
 
 static inline pa_bool_t is_unicode_valid(uint32_t ch) {
diff --git a/src/pulse/util.c b/src/pulse/util.c
index 6656bc3..75bef42 100644
--- a/src/pulse/util.c
+++ b/src/pulse/util.c
@@ -64,6 +64,8 @@
 
 #include "util.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 char *pa_get_user_name(char *s, size_t l) {
     const char *p;
     char *name = NULL;
diff --git a/src/pulse/volume.c b/src/pulse/volume.c
index cf0a226..3478893 100644
--- a/src/pulse/volume.c
+++ b/src/pulse/volume.c
@@ -34,6 +34,8 @@
 
 #include "volume.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 int pa_cvolume_equal(const pa_cvolume *a, const pa_cvolume *b) {
     int i;
     pa_assert(a);
diff --git a/src/pulse/xmalloc.c b/src/pulse/xmalloc.c
index e17a354..840c9df 100644
--- a/src/pulse/xmalloc.c
+++ b/src/pulse/xmalloc.c
@@ -35,6 +35,8 @@
 
 #include "xmalloc.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 /* Make sure not to allocate more than this much memory. */
 #define MAX_ALLOC_SIZE (1024*1024*96) /* 96MB */
 
diff --git a/src/pulsecore/authkey.c b/src/pulsecore/authkey.c
index ac81513..6ad4574 100644
--- a/src/pulsecore/authkey.c
+++ b/src/pulsecore/authkey.c
@@ -42,6 +42,8 @@
 
 #include "authkey.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 /* Generate a new authorization key, store it in file fd and return it in *data  */
 static int generate(int fd, void *ret_data, size_t length) {
     ssize_t r;
diff --git a/src/pulsecore/conf-parser.c b/src/pulsecore/conf-parser.c
index 7152955..8098e70 100644
--- a/src/pulsecore/conf-parser.c
+++ b/src/pulsecore/conf-parser.c
@@ -36,6 +36,8 @@
 
 #include "conf-parser.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 #define WHITESPACE " \t\n"
 #define COMMENTS "#;\n"
 
diff --git a/src/pulsecore/core-error.c b/src/pulsecore/core-error.c
index 4d930a0..f731be5 100644
--- a/src/pulsecore/core-error.c
+++ b/src/pulsecore/core-error.c
@@ -38,6 +38,8 @@
 
 #include "core-error.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 PA_STATIC_TLS_DECLARE(cstrerror, pa_xfree);
 
 const char* pa_cstrerror(int errnum) {
diff --git a/src/pulsecore/core-rtclock.c b/src/pulsecore/core-rtclock.c
index 6632cc6..537cfb1 100644
--- a/src/pulsecore/core-rtclock.c
+++ b/src/pulsecore/core-rtclock.c
@@ -54,6 +54,8 @@
 
 #include "core-rtclock.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 #ifdef OS_IS_WIN32
 static int64_t counter_freq = 0;
 #endif
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 61f980e..1044dad 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -138,6 +138,8 @@
 
 #include "core-util.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 /* Not all platforms have this */
 #ifndef MSG_NOSIGNAL
 #define MSG_NOSIGNAL 0
diff --git a/src/pulsecore/dynarray.c b/src/pulsecore/dynarray.c
index 78b2eb9..62c58c1 100644
--- a/src/pulsecore/dynarray.c
+++ b/src/pulsecore/dynarray.c
@@ -31,6 +31,8 @@
 
 #include "dynarray.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 /* If the array becomes to small, increase its size by 25 entries */
 #define INCREASE_BY 25
 
diff --git a/src/pulsecore/flist.c b/src/pulsecore/flist.c
index 0aa95c7..03475e2 100644
--- a/src/pulsecore/flist.c
+++ b/src/pulsecore/flist.c
@@ -37,6 +37,8 @@
 
 #include "flist.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 #define FLIST_SIZE 128
 
 /* Atomic table indices contain
diff --git a/src/pulsecore/iochannel.c b/src/pulsecore/iochannel.c
index fa3d767..f020535 100644
--- a/src/pulsecore/iochannel.c
+++ b/src/pulsecore/iochannel.c
@@ -43,6 +43,8 @@
 
 #include "iochannel.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 struct pa_iochannel {
     int ifd, ofd;
     int ifd_type, ofd_type;
diff --git a/src/pulsecore/ioline.c b/src/pulsecore/ioline.c
index a18188d..5781d91 100644
--- a/src/pulsecore/ioline.c
+++ b/src/pulsecore/ioline.c
@@ -39,6 +39,8 @@
 
 #include "ioline.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 #define BUFFER_LIMIT (64*1024)
 #define READ_SIZE (1024)
 
diff --git a/src/pulsecore/ipacl.c b/src/pulsecore/ipacl.c
index 5455d0e..39beaa2 100644
--- a/src/pulsecore/ipacl.c
+++ b/src/pulsecore/ipacl.c
@@ -49,6 +49,8 @@
 
 #include "ipacl.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 struct acl_entry {
     PA_LLIST_FIELDS(struct acl_entry);
     int family;
diff --git a/src/pulsecore/lock-autospawn.c b/src/pulsecore/lock-autospawn.c
index b1d414b..a936a86 100644
--- a/src/pulsecore/lock-autospawn.c
+++ b/src/pulsecore/lock-autospawn.c
@@ -42,6 +42,8 @@
 
 #include "lock-autospawn.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 /* So, why do we have this complex code here with threads and pipes
  * and stuff? For two reasons: POSIX file locks are per-process, not
  * per-file descriptor. That means that two contexts within the same
diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c
index 8eaef54..628aa59 100644
--- a/src/pulsecore/log.c
+++ b/src/pulsecore/log.c
@@ -50,6 +50,8 @@
 #include <pulsecore/once.h>
 #include <pulsecore/ratelimit.h>
 #include <pulsecore/thread.h>
+#include <pulsecore/llist.h>
+#include <pulsecore/mutex.h>
 
 #include "log.h"
 
@@ -63,6 +65,20 @@
 #define ENV_LOG_BACKTRACE "PULSE_LOG_BACKTRACE"
 #define ENV_LOG_BACKTRACE_SKIP "PULSE_LOG_BACKTRACE_SKIP"
 #define ENV_LOG_NO_RATELIMIT "PULSE_LOG_NO_RATE_LIMIT"
+#define ENV_LOG_DEBUG "PULSE_LOG_DEBUG"
+
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
+struct pa_log_category {
+    PA_LLIST_FIELDS(pa_log_category_t);
+    int threshold;
+    int color;
+    const char *name;
+    const char *description;
+};
+
+static pa_static_mutex categories_mutex = PA_STATIC_MUTEX_INIT;
+static pa_log_category_t *categories = NULL;
 
 static char *ident = NULL; /* in local charset format */
 static pa_log_target_t target = PA_LOG_STDERR, target_override;
@@ -207,11 +223,21 @@ static char* get_backtrace(unsigned show_nframes) {
 
 #endif
 
+pa_log_category_t *PA_LOG_CAT_CORE = NULL;
+pa_log_category_t *PA_LOG_CAT_CHANNELMAP = NULL;
+pa_log_category_t *PA_LOG_CAT_CONTEXT = NULL;
+static void init_log_categories(void) {
+    PA_LOG_CAT_CORE = pa_log_category_new("core", 0, "pulsecore");
+    PA_LOG_CAT_CONTEXT = pa_log_category_new("channelmap", 0, "channelmap");
+}
+
 static void init_defaults(void) {
     PA_ONCE_BEGIN {
 
         const char *e;
 
+        init_log_categories();
+
         if (!ident) {
             char binary[256];
             if (pa_get_binary_name(binary, sizeof(binary)))
@@ -262,10 +288,37 @@ static void init_defaults(void) {
         if (getenv(ENV_LOG_NO_RATELIMIT))
             no_rate_limit = TRUE;
 
+        if ((e = getenv(ENV_LOG_DEBUG)))
+            parse_log_debug(e);
+
     } PA_ONCE_END;
 }
 
+void parse_log_debug(const char *debug)
+{
+    const char *state = NULL;
+    const char *p;
+
+    /*
+    while ((p = pa_split(debug, ",", &state))) {
+        if (strchr(p, ':')) {
+        } else {
+        }
+    }
+    */
+    pa_mutex *mutex = NULL;
+    pa_log_category_t *iter;
+
+    mutex = pa_static_mutex_get(&categories_mutex, TRUE, TRUE);
+    pa_mutex_lock(mutex);
+    PA_LLIST_FOREACH(iter, categories) {
+        iter->threshold = 0;
+    }
+    pa_mutex_unlock(mutex);
+}
+
 void pa_log_levelv_meta(
+        pa_log_category_t *category,
         pa_log_level_t level,
         const char*file,
         int line,
@@ -290,6 +343,11 @@ void pa_log_levelv_meta(
 
     init_defaults();
 
+    if (category == NULL)
+        return;
+    if (level < category->threshold)
+        return;
+
     _target = target_override_set ? target_override : target;
     _maximum_level = PA_MAX(maximum_level, maximum_level_override);
     _show_backtrace = PA_MAX(show_backtrace, show_backtrace_override);
@@ -438,6 +496,7 @@ void pa_log_levelv_meta(
 }
 
 void pa_log_level_meta(
+        pa_log_category_t *category,
         pa_log_level_t level,
         const char*file,
         int line,
@@ -446,19 +505,19 @@ void pa_log_level_meta(
 
     va_list ap;
     va_start(ap, format);
-    pa_log_levelv_meta(level, file, line, func, format, ap);
+    pa_log_levelv_meta(category, level, file, line, func, format, ap);
     va_end(ap);
 }
 
-void pa_log_levelv(pa_log_level_t level, const char *format, va_list ap) {
-    pa_log_levelv_meta(level, NULL, 0, NULL, format, ap);
+void pa_log_levelv(pa_log_category_t *category, pa_log_level_t level, const char *format, va_list ap) {
+    pa_log_levelv_meta(category, level, NULL, 0, NULL, format, ap);
 }
 
-void pa_log_level(pa_log_level_t level, const char *format, ...) {
+void pa_log_level(pa_log_category_t *category, 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);
+    pa_log_levelv_meta(category, level, NULL, 0, NULL, format, ap);
     va_end(ap);
 }
 
@@ -473,3 +532,38 @@ pa_bool_t pa_log_ratelimit(pa_log_level_t level) {
 
     return pa_ratelimit_test(&ratelimit, level);
 }
+
+pa_log_category_t *pa_log_category_new(const char *name, int color, const char *description)
+{
+    pa_mutex *mutex = NULL;
+    pa_log_category_t *cat = pa_xnew0(pa_log_category_t, 1);
+
+    cat->threshold = 0;
+    cat->color = color;
+    cat->name = pa_xstrdup(name);
+    cat->description = pa_xstrdup(description);
+
+    mutex = pa_static_mutex_get(&categories_mutex, TRUE, TRUE);
+    pa_mutex_lock(mutex);
+    PA_LLIST_PREPEND(pa_log_category_t, categories, cat);
+    pa_mutex_unlock(mutex);
+
+    return cat;
+}
+
+static pa_log_category_t *pa_log_category_get(const char *name)
+{
+    pa_mutex *mutex = NULL;
+    pa_log_category_t *iter;
+
+    mutex = pa_static_mutex_get(&categories_mutex, TRUE, TRUE);
+    pa_mutex_lock(mutex);
+    PA_LLIST_FOREACH(iter, categories) {
+        if (pa_streq(iter->name, name)) {
+                pa_mutex_unlock(mutex);
+                return iter;
+        }
+    }
+    pa_mutex_unlock(mutex);
+    return NULL;
+}
diff --git a/src/pulsecore/log.h b/src/pulsecore/log.h
index 8dd056b..c10d0cc 100644
--- a/src/pulsecore/log.h
+++ b/src/pulsecore/log.h
@@ -31,6 +31,23 @@
 
 /* A simple logging subsystem */
 
+typedef struct pa_log_category pa_log_category_t;
+
+pa_log_category_t *pa_log_category_new(const char *name,
+                                       int color,
+                                       const char *description);
+
+extern pa_log_category_t *PA_LOG_CAT_CORE;
+extern pa_log_category_t *PA_LOG_CAT_CHANNELMAP;
+extern pa_log_category_t *PA_LOG_CAT_CONTEXT;
+
+#define PA_LOG_CATEGORY_STATIC(category) \
+    static pa_log_category_t *category = NULL;
+#define PA_LOG_CATEGORY_INIT(category,name,color) do {                      \
+    if (category == NULL)                                                   \
+        category = pa_log_category_new(name, color, pa__get_description()); \
+} while (0)
+
 /* Where to log to */
 typedef enum pa_log_target {
     PA_LOG_STDERR,  /* default */
@@ -86,13 +103,15 @@ void pa_log_set_show_backtrace(unsigned nlevels);
 void pa_log_set_skip_backtrace(unsigned nlevels);
 
 void pa_log_level_meta(
+        pa_log_category_t *category,
         pa_log_level_t level,
         const char*file,
         int line,
         const char *func,
-        const char *format, ...) PA_GCC_PRINTF_ATTR(5,6);
+        const char *format, ...) PA_GCC_PRINTF_ATTR(6,7);
 
 void pa_log_levelv_meta(
+        pa_log_category_t *category,
         pa_log_level_t level,
         const char*file,
         int line,
@@ -101,10 +120,12 @@ void pa_log_levelv_meta(
         va_list ap);
 
 void pa_log_level(
+        pa_log_category_t *category,
         pa_log_level_t level,
-        const char *format, ...) PA_GCC_PRINTF_ATTR(2,3);
+        const char *format, ...) PA_GCC_PRINTF_ATTR(3,4);
 
 void pa_log_levelv(
+        pa_log_category_t *category,
         pa_log_level_t level,
         const char *format,
         va_list ap);
@@ -113,12 +134,12 @@ void pa_log_levelv(
 
 /* ISO varargs available */
 
-#define pa_log_debug(...)  pa_log_level_meta(PA_LOG_DEBUG,  __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define pa_log_info(...)   pa_log_level_meta(PA_LOG_INFO,   __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define pa_log_notice(...) pa_log_level_meta(PA_LOG_NOTICE, __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define pa_log_warn(...)   pa_log_level_meta(PA_LOG_WARN,   __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define pa_log_error(...)  pa_log_level_meta(PA_LOG_ERROR,  __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define pa_logl(level, ...)  pa_log_level_meta(level,  __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define pa_log_debug(...)  pa_log_level_meta(PA_LOG_CATEGORY_DEFAULT, PA_LOG_DEBUG,  __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define pa_log_info(...)   pa_log_level_meta(PA_LOG_CATEGORY_DEFAULT, PA_LOG_INFO,   __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define pa_log_notice(...) pa_log_level_meta(PA_LOG_CATEGORY_DEFAULT, PA_LOG_NOTICE, __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define pa_log_warn(...)   pa_log_level_meta(PA_LOG_CATEGORY_DEFAULT, PA_LOG_WARN,   __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define pa_log_error(...)  pa_log_level_meta(PA_LOG_CATEGORY_DEFAULT, PA_LOG_ERROR,  __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define pa_logl(level, ...)  pa_log_level_meta(PA_LOG_CATEGORY_DEFAULT, level,  __FILE__, __LINE__, __func__, __VA_ARGS__)
 
 #else
 
@@ -126,7 +147,7 @@ void pa_log_levelv(
 PA_GCC_UNUSED static void pa_log_##suffix(const char *format, ...) { \
     va_list ap; \
     va_start(ap, format); \
-    pa_log_levelv_meta(level, NULL, 0, NULL, format, ap); \
+    pa_log_levelv_meta(PA_LOG_CATEGORY_DEFAULT, level, NULL, 0, NULL, format, ap); \
     va_end(ap); \
 }
 
diff --git a/src/pulsecore/macro.h b/src/pulsecore/macro.h
index c6d7d56..3cfa0ce 100644
--- a/src/pulsecore/macro.h
+++ b/src/pulsecore/macro.h
@@ -221,11 +221,11 @@ typedef int pa_bool_t;
 #define pa_assert_se(expr)                                              \
     do {                                                                \
         if (PA_UNLIKELY(!(expr))) {                                     \
-            pa_log_error("Assertion '%s' failed at %s:%u, function %s(). Aborting.", #expr , __FILE__, __LINE__, PA_PRETTY_FUNCTION); \
             abort();                                                    \
         }                                                               \
     } while (FALSE)
 
+//pa_log_error("Assertion '%s' failed at %s:%u, function %s(). Aborting.", #expr , __FILE__, __LINE__, PA_PRETTY_FUNCTION);
 /* Does exactly nothing */
 #define pa_nop() do {} while (FALSE)
 
diff --git a/src/pulsecore/ratelimit.c b/src/pulsecore/ratelimit.c
index a274d2c..c5c03ee 100644
--- a/src/pulsecore/ratelimit.c
+++ b/src/pulsecore/ratelimit.c
@@ -30,6 +30,8 @@
 
 #include "ratelimit.h"
 
+#define PA_LOG_CATEGORY_DEFAULT PA_LOG_CAT_CORE
+
 static pa_static_mutex mutex = PA_STATIC_MUTEX_INIT;
 
 /* Modelled after Linux' lib/ratelimit.c by Dave Young
-- 
1.7.6.5



More information about the pulseaudio-discuss mailing list