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:
parent
d2acad8f0e
commit
dd8d5e1bed
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue