1
Fork 0

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.
This commit is contained in:
Pauli Virtanen 2023-12-23 21:13:22 +02:00 committed by Wim Taymans
parent d2acad8f0e
commit dd8d5e1bed
2 changed files with 25 additions and 35 deletions

View File

@ -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

View File

@ -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);