thread-loop: remove the event

We don't need the event to wake up and stop the thread loop, we can
simply use _invoke() of the loop implementation, like we do for the
data loop.
This commit is contained in:
Wim Taymans 2025-05-30 12:12:03 +02:00
parent 820e0fccb1
commit fecf1bcba4

View file

@ -31,21 +31,12 @@ struct pw_thread_loop {
struct spa_hook hook; struct spa_hook hook;
struct spa_source *event;
unsigned int created:1; unsigned int created:1;
unsigned int running:1; unsigned int running:1;
unsigned int start_signal:1; unsigned int start_signal:1;
}; };
/** \endcond */ /** \endcond */
static void do_stop(void *data, uint64_t count)
{
struct pw_thread_loop *this = data;
pw_log_debug("stopping");
this->running = false;
}
#define CHECK(expression,label) \ #define CHECK(expression,label) \
do { \ do { \
if ((errno = (expression)) != 0) { \ if ((errno = (expression)) != 0) { \
@ -86,11 +77,6 @@ static struct pw_thread_loop *loop_new(struct pw_loop *loop,
spa_hook_list_init(&this->listener_list); spa_hook_list_init(&this->listener_list);
if ((this->event = pw_loop_add_event(this->loop, do_stop, this)) == NULL) {
res = -errno;
goto clean_this;
}
return this; return this;
clean_this: clean_this:
@ -154,8 +140,6 @@ void pw_thread_loop_destroy(struct pw_thread_loop *loop)
spa_hook_list_clean(&loop->listener_list); spa_hook_list_clean(&loop->listener_list);
pw_loop_destroy_source(loop->loop, loop->event);
if (loop->created) if (loop->created)
pw_loop_destroy(loop->loop); pw_loop_destroy(loop->loop);
@ -237,6 +221,15 @@ error:
return -err; return -err;
} }
static int do_stop(struct spa_loop *loop, bool async, uint32_t seq,
const void *data, size_t size, void *user_data)
{
struct pw_thread_loop *this = user_data;
pw_log_debug("%p: stopping", this);
this->running = false;
return 0;
}
/** Quit the loop and stop its thread /** Quit the loop and stop its thread
* *
* \param loop a \ref pw_thread_loop * \param loop a \ref pw_thread_loop
@ -248,7 +241,7 @@ void pw_thread_loop_stop(struct pw_thread_loop *loop)
pw_log_debug("%p stopping %d", loop, loop->running); pw_log_debug("%p stopping %d", loop, loop->running);
if (loop->running) { if (loop->running) {
pw_log_debug("%p signal", loop); pw_log_debug("%p signal", loop);
pw_loop_signal_event(loop->loop, loop->event); pw_loop_invoke(loop->loop, do_stop, 1, NULL, 0, false, loop);
pw_log_debug("%p join", loop); pw_log_debug("%p join", loop);
pthread_join(loop->thread, NULL); pthread_join(loop->thread, NULL);
pw_log_debug("%p joined", loop); pw_log_debug("%p joined", loop);