destroy resources first, then the global

This commit is contained in:
Wim Taymans 2019-05-22 10:09:48 +02:00
parent c67f903c61
commit 0951a97a36
7 changed files with 33 additions and 18 deletions

View file

@ -301,18 +301,18 @@ void pw_client_destroy(struct pw_client *client)
if (client->registered) if (client->registered)
spa_list_remove(&client->link); 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) { if (client->global) {
spa_hook_remove(&client->global_listener); spa_hook_remove(&client->global_listener);
pw_global_destroy(client->global); 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_log_debug("client %p: free", impl);
pw_client_events_free(client);
pw_map_clear(&client->objects); pw_map_clear(&client->objects);
pw_map_clear(&client->types); pw_map_clear(&client->types);

View file

@ -488,6 +488,7 @@ void pw_core_destroy(struct pw_core *core)
struct pw_global *global; struct pw_global *global;
struct pw_module *module; struct pw_module *module;
struct pw_remote *remote; struct pw_remote *remote;
struct pw_resource *resource;
struct pw_node *node; struct pw_node *node;
pw_log_debug("core %p: destroy", core); 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) spa_list_consume(node, &core->node_list, link)
pw_node_destroy(node); 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) spa_list_consume(global, &core->global_list, link)
pw_global_destroy(global); pw_global_destroy(global);
pw_map_clear(&core->globals);
pw_log_debug("core %p: free", core);
pw_core_events_free(core); pw_core_events_free(core);
pw_data_loop_destroy(core->data_loop_impl); 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_properties_free(core->properties);
pw_map_clear(&core->globals);
pw_log_debug("core %p: free", core);
free(core); free(core);
} }

View file

@ -59,16 +59,22 @@ struct pw_factory *pw_factory_new(struct pw_core *core,
SPA_EXPORT SPA_EXPORT
void pw_factory_destroy(struct pw_factory *factory) void pw_factory_destroy(struct pw_factory *factory)
{ {
struct pw_resource *resource;
pw_log_debug("factory %p: destroy", factory); pw_log_debug("factory %p: destroy", factory);
pw_factory_events_destroy(factory); pw_factory_events_destroy(factory);
if (factory->registered) if (factory->registered)
spa_list_remove(&factory->link); spa_list_remove(&factory->link);
spa_list_consume(resource, &factory->resource_list, link)
pw_resource_destroy(resource);
if (factory->global) { if (factory->global) {
spa_hook_remove(&factory->global_listener); spa_hook_remove(&factory->global_listener);
pw_global_destroy(factory->global); pw_global_destroy(factory->global);
} }
free((char *)factory->info.name); free((char *)factory->info.name);
if (factory->properties) if (factory->properties)
pw_properties_free(factory->properties); pw_properties_free(factory->properties);

View file

@ -1348,14 +1348,14 @@ void pw_link_destroy(struct pw_link *link)
output_remove(link, link->output); output_remove(link, link->output);
spa_list_consume(resource, &link->resource_list, link)
pw_resource_destroy(resource);
if (link->global) { if (link->global) {
spa_hook_remove(&link->global_listener); spa_hook_remove(&link->global_listener);
pw_global_destroy(link->global); 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_log_debug("link %p: free", impl);
pw_link_events_free(link); pw_link_events_free(link);

View file

@ -294,12 +294,13 @@ void pw_module_destroy(struct pw_module *module)
spa_list_remove(&module->link); spa_list_remove(&module->link);
spa_list_consume(resource, &module->resource_list, link)
pw_resource_destroy(resource);
if (module->global) { if (module->global) {
spa_hook_remove(&module->global_listener); spa_hook_remove(&module->global_listener);
pw_global_destroy(module->global); 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.name);
free((char *) module->info.filename); free((char *) module->info.filename);

View file

@ -649,12 +649,13 @@ void pw_node_destroy(struct pw_node *node)
spa_list_consume(port, &node->output_ports, link) spa_list_consume(port, &node->output_ports, link)
pw_port_destroy(port); pw_port_destroy(port);
spa_list_consume(resource, &node->resource_list, link)
pw_resource_destroy(resource);
if (node->global) { if (node->global) {
spa_hook_remove(&node->global_listener); spa_hook_remove(&node->global_listener);
pw_global_destroy(node->global); 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_log_debug("node %p: free", node);
pw_node_events_free(node); pw_node_events_free(node);

View file

@ -561,12 +561,13 @@ void pw_port_destroy(struct pw_port *port)
spa_list_consume(control, &port->control_list[1], port_link) spa_list_consume(control, &port->control_list[1], port_link)
pw_control_destroy(control); pw_control_destroy(control);
spa_list_consume(resource, &port->resource_list, link)
pw_resource_destroy(resource);
if (port->global) { if (port->global) {
spa_hook_remove(&port->global_listener); spa_hook_remove(&port->global_listener);
pw_global_destroy(port->global); 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_log_debug("port %p: free", port);
pw_port_events_free(port); pw_port_events_free(port);