From fecf1bcba4058372a2961153ae19607164c4fbac Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 30 May 2025 12:12:03 +0200 Subject: [PATCH] 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. --- src/pipewire/thread-loop.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/pipewire/thread-loop.c b/src/pipewire/thread-loop.c index 36fbd0183..d36482821 100644 --- a/src/pipewire/thread-loop.c +++ b/src/pipewire/thread-loop.c @@ -31,21 +31,12 @@ struct pw_thread_loop { struct spa_hook hook; - struct spa_source *event; - unsigned int created:1; unsigned int running:1; unsigned int start_signal:1; }; /** \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) \ do { \ 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); - if ((this->event = pw_loop_add_event(this->loop, do_stop, this)) == NULL) { - res = -errno; - goto clean_this; - } - return this; clean_this: @@ -154,8 +140,6 @@ void pw_thread_loop_destroy(struct pw_thread_loop *loop) spa_hook_list_clean(&loop->listener_list); - pw_loop_destroy_source(loop->loop, loop->event); - if (loop->created) pw_loop_destroy(loop->loop); @@ -237,6 +221,15 @@ error: 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 * * \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); if (loop->running) { 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); pthread_join(loop->thread, NULL); pw_log_debug("%p joined", loop);