[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