From dd8d5e1bed24935197175542c1d11b907132be66 Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Sat, 23 Dec 2023 21:13:22 +0200 Subject: [PATCH] log: make PW_LOG_TOPIC / PW_LOG_TOPIC_STATIC magical Have PW_LOG_TOPIC / PW_LOG_TOPIC_STATIC emit GCC constructor/destructor functions that register/unregister the log topic as needed. --- src/pipewire/log.c | 30 +----------------------------- src/pipewire/log.h | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/pipewire/log.c b/src/pipewire/log.c index 48b674d2a..6e505754a 100644 --- a/src/pipewire/log.c +++ b/src/pipewire/log.c @@ -26,7 +26,7 @@ enum spa_log_level pw_log_level = DEFAULT_LOG_LEVEL; static struct spa_log *global_log = &default_log.log; SPA_EXPORT -struct spa_log_topic *PW_LOG_TOPIC_DEFAULT; +struct spa_log_topic * const PW_LOG_TOPIC_DEFAULT; struct topic { struct spa_list link; @@ -43,7 +43,6 @@ struct pattern { static struct spa_list topics = SPA_LIST_INIT(&topics); static struct spa_list patterns = SPA_LIST_INIT(&patterns); -PW_LOG_TOPIC_STATIC(log_topic, "pw.log"); /* log topic for this file here */ PW_LOG_TOPIC(log_buffers, "pw.buffers"); PW_LOG_TOPIC(log_client, "pw.client"); PW_LOG_TOPIC(log_conf, "pw.conf"); @@ -469,33 +468,6 @@ void pw_log_log_object(enum spa_log_level level, void pw_log_init(void) { - pw_log_topic_register(PW_LOG_TOPIC_DEFAULT); - pw_log_topic_register(log_buffers); - pw_log_topic_register(log_client); - pw_log_topic_register(log_conf); - pw_log_topic_register(log_context); - pw_log_topic_register(log_core); - pw_log_topic_register(log_data_loop); - pw_log_topic_register(log_device); - pw_log_topic_register(log_factory); - pw_log_topic_register(log_filter); - pw_log_topic_register(log_global); - pw_log_topic_register(log_link); - pw_log_topic_register(log_loop); - pw_log_topic_register(log_main_loop); - pw_log_topic_register(log_mem); - pw_log_topic_register(log_metadata); - pw_log_topic_register(log_module); - pw_log_topic_register(log_node); - pw_log_topic_register(log_port); - pw_log_topic_register(log_properties); - pw_log_topic_register(log_protocol); - pw_log_topic_register(log_proxy); - pw_log_topic_register(log_resource); - pw_log_topic_register(log_stream); - pw_log_topic_register(log_thread_loop); - pw_log_topic_register(log_topic); - pw_log_topic_register(log_work_queue); } void diff --git a/src/pipewire/log.h b/src/pipewire/log.h index 8632d330d..44be092fa 100644 --- a/src/pipewire/log.h +++ b/src/pipewire/log.h @@ -28,7 +28,7 @@ extern "C" { /** The global log level */ extern enum spa_log_level pw_log_level; -extern struct spa_log_topic *PW_LOG_TOPIC_DEFAULT; +extern struct spa_log_topic * const PW_LOG_TOPIC_DEFAULT; /** Configure a logging module. This is usually done automatically * in pw_init() but you can install a custom logger before calling @@ -73,6 +73,16 @@ pw_log_logv(enum spa_log_level level, int line, const char *func, const char *fmt, va_list args) SPA_PRINTF_FUNC(5, 0); +/** + * Define a static \ref spa_log_topic and its constructor/destructor functions. + * + * \since 1.1.0 + */ +#define PW_LOG_TOPIC_DEFINE_STATIC(var, topic) \ + static struct spa_log_topic var = SPA_LOG_TOPIC(SPA_VERSION_LOG_TOPIC, topic); \ + static void __attribute__((constructor)) var ## _register_construct(void) { pw_log_topic_register(&var); } \ + static void __attribute__((destructor)) var ## _register_destroy(void) { pw_log_topic_unregister(&var); } + /** * Declare a static log topic named \a var. The usual usage is: * \code @@ -83,26 +93,34 @@ pw_log_logv(enum spa_log_level level, * pw_log_debug("bar"); * } * \endcode + * + * This macro also emits GCC attribute constructor/destructor + * functions that automatically call pw_log_topic_register/unregister. */ #define PW_LOG_TOPIC_STATIC(var, topic) \ - static struct spa_log_topic SPA_CONCAT(var, __LINE__) = SPA_LOG_TOPIC(0, topic); \ - static struct spa_log_topic *var = &SPA_CONCAT(var, __LINE__) + PW_LOG_TOPIC_DEFINE_STATIC(var ## _value, topic) \ + static struct spa_log_topic * const var = &(var ## _value) /** * Declare a static log topic named \a var. * See \ref PW_LOG_TOPIC_STATIC for an example usage. */ #define PW_LOG_TOPIC_EXTERN(var) \ - extern struct spa_log_topic *var + extern struct spa_log_topic * const var /** * Declare a static log topic named \a var. * See \ref PW_LOG_TOPIC_STATIC for an example usage. */ #define PW_LOG_TOPIC(var, topic) \ - struct spa_log_topic SPA_CONCAT(var, __LINE__) = SPA_LOG_TOPIC(0, topic); \ - struct spa_log_topic *var = &SPA_CONCAT(var, __LINE__) + PW_LOG_TOPIC_DEFINE_STATIC(var ## _value, topic) \ + struct spa_log_topic * const var = &(var ## _value) +/** + * \deprecated Use \ref pw_log_topic_register and \ref pw_log_topic_unregister + * instead, or rely on the auto-registration by \ref PW_LOG_TOPIC and + * \ref PW_LOG_TOPIC_STATIC. + */ #define PW_LOG_TOPIC_INIT(var) \ spa_log_topic_init(pw_log_get(), var);