From b5811280efb2d7667455e665b7ab903d7ed84e64 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 9 Dec 2019 12:30:49 +0100 Subject: [PATCH] core-proxy: improve cleanup Also disconnect filters. Ignore multiple destroy calls. This can happen when the protocol destroys the core-proxy and some implementation cleanup code does the same. The cleanup code can't reliably know about this cleanup. --- src/pipewire/core-proxy.c | 17 +++++++++++------ src/pipewire/private.h | 2 ++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/pipewire/core-proxy.c b/src/pipewire/core-proxy.c index b5fac42dc..d6b000703 100644 --- a/src/pipewire/core-proxy.c +++ b/src/pipewire/core-proxy.c @@ -183,30 +183,35 @@ static void core_proxy_destroy(void *data) { struct pw_core_proxy *core_proxy = data; struct pw_stream *stream, *s2; - struct pw_filter *filter; + struct pw_filter *filter, *f2; + + if (core_proxy->destroyed) + return; + + core_proxy->destroyed = true; pw_log_debug(NAME" %p: core proxy destroy", core_proxy); + spa_list_remove(&core_proxy->link); spa_list_for_each_safe(stream, s2, &core_proxy->stream_list, link) pw_stream_disconnect(stream); + spa_list_for_each_safe(filter, f2, &core_proxy->filter_list, link) + pw_filter_disconnect(filter); pw_protocol_client_disconnect(core_proxy->conn); - core_proxy->client_proxy = NULL; pw_map_for_each(&core_proxy->objects, destroy_proxy, core_proxy); pw_map_reset(&core_proxy->objects); - pw_mempool_destroy(core_proxy->pool); - spa_list_consume(stream, &core_proxy->stream_list, link) pw_stream_destroy(stream); spa_list_consume(filter, &core_proxy->filter_list, link) pw_filter_destroy(filter); - pw_protocol_client_destroy(core_proxy->conn); + pw_mempool_destroy(core_proxy->pool); - spa_list_remove(&core_proxy->link); + pw_protocol_client_destroy(core_proxy->conn); pw_map_clear(&core_proxy->objects); diff --git a/src/pipewire/private.h b/src/pipewire/private.h index ea6493718..d6bdd048b 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -753,6 +753,8 @@ struct pw_core_proxy { int recv_seq; /**< last received sequence number */ int send_seq; /**< last protocol result code */ + unsigned int destroyed:1; + void *user_data; /**< extra user data */ };