log: add topic for data and thread loop

This commit is contained in:
Wim Taymans 2021-10-02 13:44:50 +02:00
parent f0085b383e
commit e9af0e4ef8
3 changed files with 40 additions and 33 deletions

View file

@ -31,7 +31,8 @@
#include "pipewire/private.h" #include "pipewire/private.h"
#include "pipewire/thread.h" #include "pipewire/thread.h"
#define NAME "data-loop" PW_LOG_TOPIC_EXTERN(log_data_loop);
#define PW_LOG_TOPIC_DEFAULT log_data_loop
SPA_EXPORT SPA_EXPORT
int pw_data_loop_wait(struct pw_data_loop *this, int timeout) int pw_data_loop_wait(struct pw_data_loop *this, int timeout)
@ -61,7 +62,7 @@ void pw_data_loop_exit(struct pw_data_loop *this)
static void thread_cleanup(void *arg) static void thread_cleanup(void *arg)
{ {
struct pw_data_loop *this = arg; struct pw_data_loop *this = arg;
pw_log_debug(NAME" %p: leave thread", this); pw_log_debug("%p: leave thread", this);
this->running = false; this->running = false;
pw_loop_leave(this->loop); pw_loop_leave(this->loop);
} }
@ -71,7 +72,7 @@ static void *do_loop(void *user_data)
struct pw_data_loop *this = user_data; struct pw_data_loop *this = user_data;
int res; int res;
pw_log_debug(NAME" %p: enter thread", this); pw_log_debug("%p: enter thread", this);
pw_loop_enter(this->loop); pw_loop_enter(this->loop);
pthread_cleanup_push(thread_cleanup, this); pthread_cleanup_push(thread_cleanup, this);
@ -80,7 +81,7 @@ static void *do_loop(void *user_data)
if ((res = pw_loop_iterate(this->loop, -1)) < 0) { if ((res = pw_loop_iterate(this->loop, -1)) < 0) {
if (res == -EINTR) if (res == -EINTR)
continue; continue;
pw_log_error(NAME" %p: iterate error %d (%s)", pw_log_error("%p: iterate error %d (%s)",
this, res, spa_strerror(res)); this, res, spa_strerror(res));
} }
} }
@ -92,7 +93,7 @@ static void *do_loop(void *user_data)
static void do_stop(void *data, uint64_t count) static void do_stop(void *data, uint64_t count)
{ {
struct pw_data_loop *this = data; struct pw_data_loop *this = data;
pw_log_debug(NAME" %p: stopping", this); pw_log_debug("%p: stopping", this);
this->running = false; this->running = false;
} }
@ -108,7 +109,7 @@ static struct pw_data_loop *loop_new(struct pw_loop *loop, const struct spa_dict
goto error_cleanup; goto error_cleanup;
} }
pw_log_debug(NAME" %p: new", this); pw_log_debug("%p: new", this);
if (loop == NULL) { if (loop == NULL) {
loop = pw_loop_new(props); loop = pw_loop_new(props);
@ -116,7 +117,7 @@ static struct pw_data_loop *loop_new(struct pw_loop *loop, const struct spa_dict
} }
if (loop == NULL) { if (loop == NULL) {
res = -errno; res = -errno;
pw_log_error(NAME" %p: can't create loop: %m", this); pw_log_error("%p: can't create loop: %m", this);
goto error_free; goto error_free;
} }
this->loop = loop; this->loop = loop;
@ -127,7 +128,7 @@ static struct pw_data_loop *loop_new(struct pw_loop *loop, const struct spa_dict
this->event = pw_loop_add_event(this->loop, do_stop, this); this->event = pw_loop_add_event(this->loop, do_stop, this);
if (this->event == NULL) { if (this->event == NULL) {
res = -errno; res = -errno;
pw_log_error(NAME" %p: can't add event: %m", this); pw_log_error("%p: can't add event: %m", this);
goto error_loop_destroy; goto error_loop_destroy;
} }
} }
@ -162,7 +163,7 @@ struct pw_data_loop *pw_data_loop_new(const struct spa_dict *props)
SPA_EXPORT SPA_EXPORT
void pw_data_loop_destroy(struct pw_data_loop *loop) void pw_data_loop_destroy(struct pw_data_loop *loop)
{ {
pw_log_debug(NAME" %p: destroy", loop); pw_log_debug("%p: destroy", loop);
pw_data_loop_emit_destroy(loop); pw_data_loop_emit_destroy(loop);
@ -211,7 +212,7 @@ int pw_data_loop_start(struct pw_data_loop *loop)
thr = pw_thread_utils_create(NULL, do_loop, loop); thr = pw_thread_utils_create(NULL, do_loop, loop);
loop->thread = (pthread_t)thr; loop->thread = (pthread_t)thr;
if (thr == NULL) { if (thr == NULL) {
pw_log_error(NAME" %p: can't create thread: %m", loop); pw_log_error("%p: can't create thread: %m", loop);
loop->running = false; loop->running = false;
return -errno; return -errno;
} }
@ -229,20 +230,20 @@ int pw_data_loop_start(struct pw_data_loop *loop)
SPA_EXPORT SPA_EXPORT
int pw_data_loop_stop(struct pw_data_loop *loop) int pw_data_loop_stop(struct pw_data_loop *loop)
{ {
pw_log_debug(NAME": %p stopping", loop); pw_log_debug("%p stopping", loop);
if (loop->running) { if (loop->running) {
if (loop->event) { if (loop->event) {
pw_log_debug(NAME": %p signal", loop); pw_log_debug("%p signal", loop);
pw_loop_signal_event(loop->loop, loop->event); pw_loop_signal_event(loop->loop, loop->event);
} else { } else {
pw_log_debug(NAME": %p cancel", loop); pw_log_debug("%p cancel", loop);
pthread_cancel(loop->thread); pthread_cancel(loop->thread);
} }
pw_log_debug(NAME": %p join", loop); pw_log_debug("%p join", loop);
pw_thread_utils_join((struct spa_thread*)loop->thread, NULL); pw_thread_utils_join((struct spa_thread*)loop->thread, NULL);
pw_log_debug(NAME": %p joined", loop); pw_log_debug("%p joined", loop);
} }
pw_log_debug(NAME": %p stopped", loop); pw_log_debug("%p stopped", loop);
return 0; return 0;
} }

View file

@ -51,6 +51,7 @@ 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_buffers, "pw.buffers");
PW_LOG_TOPIC(log_conf, "pw.conf"); PW_LOG_TOPIC(log_conf, "pw.conf");
PW_LOG_TOPIC(log_context, "pw.context"); PW_LOG_TOPIC(log_context, "pw.context");
PW_LOG_TOPIC(log_data_loop, "pw.data-loop");
PW_LOG_TOPIC(log_metadata, "pw.metadata"); PW_LOG_TOPIC(log_metadata, "pw.metadata");
PW_LOG_TOPIC(log_node, "pw.node"); PW_LOG_TOPIC(log_node, "pw.node");
PW_LOG_TOPIC(log_port, "pw.port"); PW_LOG_TOPIC(log_port, "pw.port");
@ -63,6 +64,7 @@ PW_LOG_TOPIC(log_factory, "pw.factory");
PW_LOG_TOPIC(log_module, "pw.module"); PW_LOG_TOPIC(log_module, "pw.module");
PW_LOG_TOPIC(log_device, "pw.device"); PW_LOG_TOPIC(log_device, "pw.device");
PW_LOG_TOPIC(log_resource, "pw.resource"); PW_LOG_TOPIC(log_resource, "pw.resource");
PW_LOG_TOPIC(log_thread_loop, "pw.thread-loop");
PW_LOG_TOPIC(PW_LOG_TOPIC_DEFAULT, "default"); PW_LOG_TOPIC(PW_LOG_TOPIC_DEFAULT, "default");
@ -420,6 +422,7 @@ pw_log_init(void)
PW_LOG_TOPIC_INIT(PW_LOG_TOPIC_DEFAULT); PW_LOG_TOPIC_INIT(PW_LOG_TOPIC_DEFAULT);
PW_LOG_TOPIC_INIT(log_buffers); PW_LOG_TOPIC_INIT(log_buffers);
PW_LOG_TOPIC_INIT(log_conf); PW_LOG_TOPIC_INIT(log_conf);
PW_LOG_TOPIC_INIT(log_data_loop);
PW_LOG_TOPIC_INIT(log_topic); PW_LOG_TOPIC_INIT(log_topic);
PW_LOG_TOPIC_INIT(log_context); PW_LOG_TOPIC_INIT(log_context);
PW_LOG_TOPIC_INIT(log_metadata); PW_LOG_TOPIC_INIT(log_metadata);
@ -434,4 +437,5 @@ pw_log_init(void)
PW_LOG_TOPIC_INIT(log_module); PW_LOG_TOPIC_INIT(log_module);
PW_LOG_TOPIC_INIT(log_device); PW_LOG_TOPIC_INIT(log_device);
PW_LOG_TOPIC_INIT(log_resource); PW_LOG_TOPIC_INIT(log_resource);
PW_LOG_TOPIC_INIT(log_thread_loop);
} }

View file

@ -31,7 +31,9 @@
#include "log.h" #include "log.h"
#include "thread-loop.h" #include "thread-loop.h"
#define NAME "thread-loop" PW_LOG_TOPIC_EXTERN(log_thread_loop);
#define PW_LOG_TOPIC_DEFAULT log_thread_loop
#define pw_thread_loop_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_thread_loop_events, m, v, ##__VA_ARGS__) #define pw_thread_loop_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_thread_loop_events, m, v, ##__VA_ARGS__)
#define pw_thread_loop_events_destroy(o) pw_thread_loop_events_emit(o, destroy, 0) #define pw_thread_loop_events_destroy(o) pw_thread_loop_events_emit(o, destroy, 0)
@ -118,7 +120,7 @@ static struct pw_thread_loop *loop_new(struct pw_loop *loop,
if (this == NULL) if (this == NULL)
return NULL; return NULL;
pw_log_debug(NAME" %p: new name:%s", this, name); pw_log_debug("%p: new name:%s", this, name);
if (loop == NULL) { if (loop == NULL) {
loop = pw_loop_new(props); loop = pw_loop_new(props);
@ -253,18 +255,18 @@ static void *do_loop(void *user_data)
int res; int res;
pthread_mutex_lock(&this->lock); pthread_mutex_lock(&this->lock);
pw_log_debug(NAME" %p: enter thread", this); pw_log_debug("%p: enter thread", this);
pw_loop_enter(this->loop); pw_loop_enter(this->loop);
while (this->running) { while (this->running) {
if ((res = pw_loop_iterate(this->loop, -1)) < 0) { if ((res = pw_loop_iterate(this->loop, -1)) < 0) {
if (res == -EINTR) if (res == -EINTR)
continue; continue;
pw_log_warn(NAME" %p: iterate error %d (%s)", pw_log_warn("%p: iterate error %d (%s)",
this, res, spa_strerror(res)); this, res, spa_strerror(res));
} }
} }
pw_log_debug(NAME" %p: leave thread", this); pw_log_debug("%p: leave thread", this);
pw_loop_leave(this->loop); pw_loop_leave(this->loop);
pthread_mutex_unlock(&this->lock); pthread_mutex_unlock(&this->lock);
@ -285,13 +287,13 @@ int pw_thread_loop_start(struct pw_thread_loop *loop)
loop->running = true; loop->running = true;
if ((err = pthread_create(&loop->thread, NULL, do_loop, loop)) != 0) { if ((err = pthread_create(&loop->thread, NULL, do_loop, loop)) != 0) {
pw_log_warn(NAME" %p: can't create thread: %s", loop, pw_log_warn("%p: can't create thread: %s", loop,
strerror(err)); strerror(err));
loop->running = false; loop->running = false;
return -err; return -err;
} }
if ((err = pthread_setname_np(loop->thread, loop->name)) != 0) if ((err = pthread_setname_np(loop->thread, loop->name)) != 0)
pw_log_warn(NAME" %p: error: %s", loop, strerror(err)); pw_log_warn("%p: error: %s", loop, strerror(err));
} }
return 0; return 0;
} }
@ -304,16 +306,16 @@ int pw_thread_loop_start(struct pw_thread_loop *loop)
SPA_EXPORT SPA_EXPORT
void pw_thread_loop_stop(struct pw_thread_loop *loop) void pw_thread_loop_stop(struct pw_thread_loop *loop)
{ {
pw_log_debug(NAME": %p stopping %d", loop, loop->running); pw_log_debug("%p stopping %d", loop, loop->running);
if (loop->running) { if (loop->running) {
pw_log_debug(NAME": %p signal", loop); pw_log_debug("%p signal", loop);
pw_loop_signal_event(loop->loop, loop->event); pw_loop_signal_event(loop->loop, loop->event);
pw_log_debug(NAME": %p join", loop); pw_log_debug("%p join", loop);
pthread_join(loop->thread, NULL); pthread_join(loop->thread, NULL);
pw_log_debug(NAME": %p joined", loop); pw_log_debug("%p joined", loop);
loop->running = false; loop->running = false;
} }
pw_log_debug(NAME": %p stopped", loop); pw_log_debug("%p stopped", loop);
} }
/** Lock the mutex associated with \a loop /** Lock the mutex associated with \a loop
@ -325,7 +327,7 @@ SPA_EXPORT
void pw_thread_loop_lock(struct pw_thread_loop *loop) void pw_thread_loop_lock(struct pw_thread_loop *loop)
{ {
pthread_mutex_lock(&loop->lock); pthread_mutex_lock(&loop->lock);
pw_log_trace(NAME": %p", loop); pw_log_trace("%p", loop);
} }
/** Unlock the mutex associated with \a loop /** Unlock the mutex associated with \a loop
@ -336,7 +338,7 @@ void pw_thread_loop_lock(struct pw_thread_loop *loop)
SPA_EXPORT SPA_EXPORT
void pw_thread_loop_unlock(struct pw_thread_loop *loop) void pw_thread_loop_unlock(struct pw_thread_loop *loop)
{ {
pw_log_trace(NAME": %p", loop); pw_log_trace("%p", loop);
pthread_mutex_unlock(&loop->lock); pthread_mutex_unlock(&loop->lock);
} }
@ -352,7 +354,7 @@ void pw_thread_loop_unlock(struct pw_thread_loop *loop)
SPA_EXPORT SPA_EXPORT
void pw_thread_loop_signal(struct pw_thread_loop *loop, bool wait_for_accept) void pw_thread_loop_signal(struct pw_thread_loop *loop, bool wait_for_accept)
{ {
pw_log_trace(NAME": %p, waiting:%d accept:%d", pw_log_trace("%p, waiting:%d accept:%d",
loop, loop->n_waiting, wait_for_accept); loop, loop->n_waiting, wait_for_accept);
if (loop->n_waiting > 0) if (loop->n_waiting > 0)
pthread_cond_broadcast(&loop->cond); pthread_cond_broadcast(&loop->cond);
@ -373,11 +375,11 @@ void pw_thread_loop_signal(struct pw_thread_loop *loop, bool wait_for_accept)
SPA_EXPORT SPA_EXPORT
void pw_thread_loop_wait(struct pw_thread_loop *loop) void pw_thread_loop_wait(struct pw_thread_loop *loop)
{ {
pw_log_trace(NAME": %p, waiting %d", loop, loop->n_waiting); pw_log_trace("%p, waiting %d", loop, loop->n_waiting);
loop->n_waiting++; loop->n_waiting++;
pthread_cond_wait(&loop->cond, &loop->lock); pthread_cond_wait(&loop->cond, &loop->lock);
loop->n_waiting--; loop->n_waiting--;
pw_log_trace(NAME": %p, waiting done %d", loop, loop->n_waiting); pw_log_trace("%p, waiting done %d", loop, loop->n_waiting);
} }
/** Wait for the loop thread to call \ref pw_thread_loop_signal() /** Wait for the loop thread to call \ref pw_thread_loop_signal()