From a804b7126784c6eecbcead671261cb5f8b76e7dd Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 10 May 2019 11:56:30 +0200 Subject: [PATCH] core: destroy all resources on hello Destroy all resources (except the core) for a client when it does a hello. This typically needs to be done after passing the connection fd from one client to another. --- src/pipewire/core.c | 12 ++++++++++++ src/pipewire/private.h | 2 ++ src/pipewire/resource.c | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 9ce1ae217..8061945ef 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -148,13 +148,25 @@ static const struct pw_resource_events resource_events = { .destroy = destroy_registry_resource }; +static int destroy_resource(void *object, void *data) +{ + struct pw_resource *resource = object; + if (resource && resource != resource->client->core_resource) { + resource->removed = true; + pw_resource_destroy(resource); + } + return 0; +} + static int core_hello(void *object, uint32_t version) { struct pw_resource *resource = object; + struct pw_client *client = resource->client; struct pw_core *this = resource->core; pw_log_debug("core %p: hello %d from resource %p", this, version, resource); this->info.change_mask = PW_CORE_CHANGE_MASK_ALL; + pw_map_for_each(&client->objects, destroy_resource, client); pw_core_resource_info(resource, &this->info); return 0; } diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 4ad64d50a..839f0d019 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -585,6 +585,8 @@ struct pw_resource { uint32_t type; /**< type of the client interface */ uint32_t version; /**< version of the client interface */ + unsigned int removed:1; /**< resource was removed from server */ + struct spa_hook implementation; struct spa_hook_list implementation_list; struct spa_hook_list listener_list; diff --git a/src/pipewire/resource.c b/src/pipewire/resource.c index 86d85e4e3..582aef50b 100644 --- a/src/pipewire/resource.c +++ b/src/pipewire/resource.c @@ -207,7 +207,7 @@ void pw_resource_destroy(struct pw_resource *resource) pw_map_insert_at(&client->objects, resource->id, NULL); pw_client_emit_resource_removed(client, resource); - if (client->core_resource) + if (client->core_resource && !resource->removed) pw_core_resource_remove_id(client->core_resource, resource->id); pw_log_debug("resource %p: free", resource);