diff --git a/src/pipewire/client.c b/src/pipewire/client.c index ef2197c92..6d237e21d 100644 --- a/src/pipewire/client.c +++ b/src/pipewire/client.c @@ -301,18 +301,18 @@ void pw_client_destroy(struct pw_client *client) if (client->registered) spa_list_remove(&client->link); + pw_map_for_each(&client->objects, destroy_resource, client); + + spa_list_consume(resource, &client->resource_list, link) + pw_resource_destroy(resource); + if (client->global) { spa_hook_remove(&client->global_listener); pw_global_destroy(client->global); } - spa_list_consume(resource, &client->resource_list, link) - pw_resource_destroy(resource); - - pw_map_for_each(&client->objects, destroy_resource, client); - - pw_client_events_free(client); pw_log_debug("client %p: free", impl); + pw_client_events_free(client); pw_map_clear(&client->objects); pw_map_clear(&client->types); diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 1172d6d08..99cac19e0 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -488,6 +488,7 @@ void pw_core_destroy(struct pw_core *core) struct pw_global *global; struct pw_module *module; struct pw_remote *remote; + struct pw_resource *resource; struct pw_node *node; pw_log_debug("core %p: destroy", core); @@ -504,9 +505,17 @@ void pw_core_destroy(struct pw_core *core) spa_list_consume(node, &core->node_list, link) pw_node_destroy(node); + spa_list_consume(resource, &core->registry_resource_list, link) + pw_resource_destroy(resource); + + spa_list_consume(resource, &core->resource_list, link) + pw_resource_destroy(resource); + spa_list_consume(global, &core->global_list, link) pw_global_destroy(global); + pw_map_clear(&core->globals); + pw_log_debug("core %p: free", core); pw_core_events_free(core); pw_data_loop_destroy(core->data_loop_impl); @@ -515,9 +524,6 @@ void pw_core_destroy(struct pw_core *core) pw_properties_free(core->properties); - pw_map_clear(&core->globals); - - pw_log_debug("core %p: free", core); free(core); } diff --git a/src/pipewire/factory.c b/src/pipewire/factory.c index 489b7659a..0872255f3 100644 --- a/src/pipewire/factory.c +++ b/src/pipewire/factory.c @@ -59,16 +59,22 @@ struct pw_factory *pw_factory_new(struct pw_core *core, SPA_EXPORT void pw_factory_destroy(struct pw_factory *factory) { + struct pw_resource *resource; + pw_log_debug("factory %p: destroy", factory); pw_factory_events_destroy(factory); if (factory->registered) spa_list_remove(&factory->link); + spa_list_consume(resource, &factory->resource_list, link) + pw_resource_destroy(resource); + if (factory->global) { spa_hook_remove(&factory->global_listener); pw_global_destroy(factory->global); } + free((char *)factory->info.name); if (factory->properties) pw_properties_free(factory->properties); diff --git a/src/pipewire/link.c b/src/pipewire/link.c index 1a37d5cee..3a4f5a3ef 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -1348,14 +1348,14 @@ void pw_link_destroy(struct pw_link *link) output_remove(link, link->output); + spa_list_consume(resource, &link->resource_list, link) + pw_resource_destroy(resource); + if (link->global) { spa_hook_remove(&link->global_listener); pw_global_destroy(link->global); } - spa_list_consume(resource, &link->resource_list, link) - pw_resource_destroy(resource); - pw_log_debug("link %p: free", impl); pw_link_events_free(link); diff --git a/src/pipewire/module.c b/src/pipewire/module.c index da4173ea8..02f446a41 100644 --- a/src/pipewire/module.c +++ b/src/pipewire/module.c @@ -294,12 +294,13 @@ void pw_module_destroy(struct pw_module *module) spa_list_remove(&module->link); + spa_list_consume(resource, &module->resource_list, link) + pw_resource_destroy(resource); + if (module->global) { spa_hook_remove(&module->global_listener); pw_global_destroy(module->global); } - spa_list_consume(resource, &module->resource_list, link) - pw_resource_destroy(resource); free((char *) module->info.name); free((char *) module->info.filename); diff --git a/src/pipewire/node.c b/src/pipewire/node.c index ad6acccc9..c7e1061ff 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -649,12 +649,13 @@ void pw_node_destroy(struct pw_node *node) spa_list_consume(port, &node->output_ports, link) pw_port_destroy(port); + spa_list_consume(resource, &node->resource_list, link) + pw_resource_destroy(resource); + if (node->global) { spa_hook_remove(&node->global_listener); pw_global_destroy(node->global); } - spa_list_consume(resource, &node->resource_list, link) - pw_resource_destroy(resource); pw_log_debug("node %p: free", node); pw_node_events_free(node); diff --git a/src/pipewire/port.c b/src/pipewire/port.c index 49e55a6d5..c35e039ed 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -561,12 +561,13 @@ void pw_port_destroy(struct pw_port *port) spa_list_consume(control, &port->control_list[1], port_link) pw_control_destroy(control); + spa_list_consume(resource, &port->resource_list, link) + pw_resource_destroy(resource); + if (port->global) { spa_hook_remove(&port->global_listener); pw_global_destroy(port->global); } - spa_list_consume(resource, &port->resource_list, link) - pw_resource_destroy(resource); pw_log_debug("port %p: free", port); pw_port_events_free(port);