mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	log: add topic for data and thread loop
This commit is contained in:
		
							parent
							
								
									f0085b383e
								
							
						
					
					
						commit
						e9af0e4ef8
					
				
					 3 changed files with 40 additions and 33 deletions
				
			
		| 
						 | 
				
			
			@ -31,7 +31,8 @@
 | 
			
		|||
#include "pipewire/private.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
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
	struct pw_data_loop *this = arg;
 | 
			
		||||
	pw_log_debug(NAME" %p: leave thread", this);
 | 
			
		||||
	pw_log_debug("%p: leave thread", this);
 | 
			
		||||
	this->running = false;
 | 
			
		||||
	pw_loop_leave(this->loop);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -71,7 +72,7 @@ static void *do_loop(void *user_data)
 | 
			
		|||
	struct pw_data_loop *this = user_data;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	pw_log_debug(NAME" %p: enter thread", this);
 | 
			
		||||
	pw_log_debug("%p: enter thread", this);
 | 
			
		||||
	pw_loop_enter(this->loop);
 | 
			
		||||
 | 
			
		||||
	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 == -EINTR)
 | 
			
		||||
				continue;
 | 
			
		||||
			pw_log_error(NAME" %p: iterate error %d (%s)",
 | 
			
		||||
			pw_log_error("%p: iterate error %d (%s)",
 | 
			
		||||
					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)
 | 
			
		||||
{
 | 
			
		||||
	struct pw_data_loop *this = data;
 | 
			
		||||
	pw_log_debug(NAME" %p: stopping", this);
 | 
			
		||||
	pw_log_debug("%p: stopping", this);
 | 
			
		||||
	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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pw_log_debug(NAME" %p: new", this);
 | 
			
		||||
	pw_log_debug("%p: new", this);
 | 
			
		||||
 | 
			
		||||
	if (loop == NULL) {
 | 
			
		||||
		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) {
 | 
			
		||||
		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;
 | 
			
		||||
	}
 | 
			
		||||
	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);
 | 
			
		||||
		if (this->event == NULL) {
 | 
			
		||||
			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;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -162,7 +163,7 @@ struct pw_data_loop *pw_data_loop_new(const struct spa_dict *props)
 | 
			
		|||
SPA_EXPORT
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +212,7 @@ int pw_data_loop_start(struct pw_data_loop *loop)
 | 
			
		|||
		thr = pw_thread_utils_create(NULL, do_loop, loop);
 | 
			
		||||
		loop->thread = (pthread_t)thr;
 | 
			
		||||
		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;
 | 
			
		||||
			return -errno;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -229,20 +230,20 @@ int pw_data_loop_start(struct pw_data_loop *loop)
 | 
			
		|||
SPA_EXPORT
 | 
			
		||||
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->event) {
 | 
			
		||||
			pw_log_debug(NAME": %p signal", loop);
 | 
			
		||||
			pw_log_debug("%p signal", loop);
 | 
			
		||||
			pw_loop_signal_event(loop->loop, loop->event);
 | 
			
		||||
		} else {
 | 
			
		||||
			pw_log_debug(NAME": %p cancel", loop);
 | 
			
		||||
			pw_log_debug("%p cancel", loop);
 | 
			
		||||
			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_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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_conf, "pw.conf");
 | 
			
		||||
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_node, "pw.node");
 | 
			
		||||
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_device, "pw.device");
 | 
			
		||||
PW_LOG_TOPIC(log_resource, "pw.resource");
 | 
			
		||||
PW_LOG_TOPIC(log_thread_loop, "pw.thread-loop");
 | 
			
		||||
 | 
			
		||||
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(log_buffers);
 | 
			
		||||
	PW_LOG_TOPIC_INIT(log_conf);
 | 
			
		||||
	PW_LOG_TOPIC_INIT(log_data_loop);
 | 
			
		||||
	PW_LOG_TOPIC_INIT(log_topic);
 | 
			
		||||
	PW_LOG_TOPIC_INIT(log_context);
 | 
			
		||||
	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_device);
 | 
			
		||||
	PW_LOG_TOPIC_INIT(log_resource);
 | 
			
		||||
	PW_LOG_TOPIC_INIT(log_thread_loop);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,9 @@
 | 
			
		|||
#include "log.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_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)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	pw_log_debug(NAME" %p: new name:%s", this, name);
 | 
			
		||||
	pw_log_debug("%p: new name:%s", this, name);
 | 
			
		||||
 | 
			
		||||
	if (loop == NULL) {
 | 
			
		||||
		loop = pw_loop_new(props);
 | 
			
		||||
| 
						 | 
				
			
			@ -253,18 +255,18 @@ static void *do_loop(void *user_data)
 | 
			
		|||
	int res;
 | 
			
		||||
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
	while (this->running) {
 | 
			
		||||
		if ((res = pw_loop_iterate(this->loop, -1)) < 0) {
 | 
			
		||||
			if (res == -EINTR)
 | 
			
		||||
				continue;
 | 
			
		||||
			pw_log_warn(NAME" %p: iterate error %d (%s)",
 | 
			
		||||
			pw_log_warn("%p: iterate error %d (%s)",
 | 
			
		||||
					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);
 | 
			
		||||
	pthread_mutex_unlock(&this->lock);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -285,13 +287,13 @@ int pw_thread_loop_start(struct pw_thread_loop *loop)
 | 
			
		|||
 | 
			
		||||
		loop->running = true;
 | 
			
		||||
		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));
 | 
			
		||||
			loop->running = false;
 | 
			
		||||
			return -err;
 | 
			
		||||
		}
 | 
			
		||||
		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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -304,16 +306,16 @@ int pw_thread_loop_start(struct pw_thread_loop *loop)
 | 
			
		|||
SPA_EXPORT
 | 
			
		||||
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) {
 | 
			
		||||
		pw_log_debug(NAME": %p signal", loop);
 | 
			
		||||
		pw_log_debug("%p signal", loop);
 | 
			
		||||
		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);
 | 
			
		||||
		pw_log_debug(NAME": %p joined", loop);
 | 
			
		||||
		pw_log_debug("%p joined", loop);
 | 
			
		||||
		loop->running = false;
 | 
			
		||||
	}
 | 
			
		||||
	pw_log_debug(NAME": %p stopped", loop);
 | 
			
		||||
	pw_log_debug("%p stopped", loop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Lock the mutex associated with \a loop
 | 
			
		||||
| 
						 | 
				
			
			@ -325,7 +327,7 @@ SPA_EXPORT
 | 
			
		|||
void pw_thread_loop_lock(struct pw_thread_loop *loop)
 | 
			
		||||
{
 | 
			
		||||
	pthread_mutex_lock(&loop->lock);
 | 
			
		||||
	pw_log_trace(NAME": %p", loop);
 | 
			
		||||
	pw_log_trace("%p", loop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Unlock the mutex associated with \a loop
 | 
			
		||||
| 
						 | 
				
			
			@ -336,7 +338,7 @@ void pw_thread_loop_lock(struct pw_thread_loop *loop)
 | 
			
		|||
SPA_EXPORT
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -352,7 +354,7 @@ void pw_thread_loop_unlock(struct pw_thread_loop *loop)
 | 
			
		|||
SPA_EXPORT
 | 
			
		||||
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);
 | 
			
		||||
	if (loop->n_waiting > 0)
 | 
			
		||||
		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
 | 
			
		||||
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++;
 | 
			
		||||
	pthread_cond_wait(&loop->cond, &loop->lock);
 | 
			
		||||
	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()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue