From a2549fc63873d3d58136a09120feaa3c7a6136c1 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 6 Nov 2020 15:55:33 +0100 Subject: [PATCH] clean the hook lists Make sure the hook lists are emptied so that the removed callbacks are called. The callers should really remove the hook they installed themselves but this is a last chance to fix things up. --- src/modules/module-protocol-native/connection.c | 2 ++ src/pipewire/context.c | 3 +++ src/pipewire/control.c | 2 ++ src/pipewire/data-loop.c | 3 +++ src/pipewire/filter.c | 3 +++ src/pipewire/global.c | 2 ++ src/pipewire/impl-client.c | 2 ++ src/pipewire/impl-core.c | 2 ++ src/pipewire/impl-device.c | 2 ++ src/pipewire/impl-factory.c | 3 +++ src/pipewire/impl-link.c | 2 ++ src/pipewire/impl-module.c | 2 ++ src/pipewire/impl-node.c | 2 ++ src/pipewire/impl-port.c | 2 ++ src/pipewire/main-loop.c | 2 ++ src/pipewire/mem.c | 2 ++ src/pipewire/protocol.c | 2 ++ src/pipewire/resource.c | 3 +++ src/pipewire/stream.c | 3 +++ src/pipewire/thread-loop.c | 2 ++ src/tests/test-endpoint.c | 1 + 21 files changed, 47 insertions(+) diff --git a/src/modules/module-protocol-native/connection.c b/src/modules/module-protocol-native/connection.c index 1807833a4..6c2408b58 100644 --- a/src/modules/module-protocol-native/connection.c +++ b/src/modules/module-protocol-native/connection.c @@ -292,6 +292,8 @@ void pw_protocol_native_connection_destroy(struct pw_protocol_native_connection spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, destroy, 0); + spa_hook_list_clean(&conn->listener_list); + clear_buffer(&impl->out, true); clear_buffer(&impl->in, true); free(impl->out.buffer_data); diff --git a/src/pipewire/context.c b/src/pipewire/context.c index 251bcf2e7..650804429 100644 --- a/src/pipewire/context.c +++ b/src/pipewire/context.c @@ -405,6 +405,9 @@ void pw_context_destroy(struct pw_context *context) pw_map_clear(&context->globals); + spa_hook_list_clean(&context->listener_list); + spa_hook_list_clean(&context->driver_listener_list); + free(context); } diff --git a/src/pipewire/control.c b/src/pipewire/control.c index 04e25739f..4feb8a8ea 100644 --- a/src/pipewire/control.c +++ b/src/pipewire/control.c @@ -119,6 +119,8 @@ void pw_control_destroy(struct pw_control *control) pw_log_debug(NAME" %p: free", control); pw_control_emit_free(control); + spa_hook_list_clean(&control->listener_list); + if (control->direction == SPA_DIRECTION_OUTPUT) { if (impl->mem) pw_memblock_unref(impl->mem); diff --git a/src/pipewire/data-loop.c b/src/pipewire/data-loop.c index 9489387d9..84f3849fb 100644 --- a/src/pipewire/data-loop.c +++ b/src/pipewire/data-loop.c @@ -173,6 +173,9 @@ void pw_data_loop_destroy(struct pw_data_loop *loop) pw_loop_destroy_source(loop->loop, loop->event); if (loop->created) pw_loop_destroy(loop->loop); + + spa_hook_list_clean(&loop->listener_list); + free(loop); } diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index c366d310c..6c89d86a4 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -1122,6 +1122,9 @@ void pw_filter_destroy(struct pw_filter *filter) pw_properties_free(filter->properties); + spa_hook_list_clean(&impl->hooks); + spa_hook_list_clean(&filter->listener_list); + free(filter->name); if (impl->data.context) diff --git a/src/pipewire/global.c b/src/pipewire/global.c index 43403e91b..dabf23fcc 100644 --- a/src/pipewire/global.c +++ b/src/pipewire/global.c @@ -389,6 +389,8 @@ void pw_global_destroy(struct pw_global *global) pw_log_debug(NAME" %p: free", global); pw_global_emit_free(global); + spa_hook_list_clean(&global->listener_list); + pw_properties_free(global->properties); free(global); diff --git a/src/pipewire/impl-client.c b/src/pipewire/impl-client.c index ae33492d5..822eb2e6e 100644 --- a/src/pipewire/impl-client.c +++ b/src/pipewire/impl-client.c @@ -576,6 +576,8 @@ void pw_impl_client_destroy(struct pw_impl_client *client) pw_log_debug(NAME" %p: free", impl); pw_impl_client_emit_free(client); + spa_hook_list_clean(&client->listener_list); + pw_map_clear(&client->objects); pw_array_clear(&impl->permissions); diff --git a/src/pipewire/impl-core.c b/src/pipewire/impl-core.c index 0b7d8f3da..474943562 100644 --- a/src/pipewire/impl-core.c +++ b/src/pipewire/impl-core.c @@ -444,6 +444,8 @@ void pw_impl_core_destroy(struct pw_impl_core *core) pw_impl_core_emit_free(core); pw_log_debug(NAME" %p: free", core); + spa_hook_list_clean(&core->listener_list); + pw_properties_free(core->properties); free(core); diff --git a/src/pipewire/impl-device.c b/src/pipewire/impl-device.c index 63a5be3ad..0342f337b 100644 --- a/src/pipewire/impl-device.c +++ b/src/pipewire/impl-device.c @@ -200,6 +200,8 @@ void pw_impl_device_destroy(struct pw_impl_device *device) pw_log_debug(NAME" %p: free", device); pw_impl_device_emit_free(device); + spa_hook_list_clean(&device->listener_list); + pw_properties_free(device->properties); free(device->name); diff --git a/src/pipewire/impl-factory.c b/src/pipewire/impl-factory.c index 377ed0be8..0ad8ab813 100644 --- a/src/pipewire/impl-factory.c +++ b/src/pipewire/impl-factory.c @@ -94,6 +94,9 @@ void pw_impl_factory_destroy(struct pw_impl_factory *factory) pw_impl_factory_emit_free(factory); pw_log_debug(NAME" %p: free", factory); + + spa_hook_list_clean(&factory->listener_list); + free((char *)factory->info.name); pw_properties_free(factory->properties); diff --git a/src/pipewire/impl-link.c b/src/pipewire/impl-link.c index f084848f9..03356958b 100644 --- a/src/pipewire/impl-link.c +++ b/src/pipewire/impl-link.c @@ -1284,6 +1284,8 @@ void pw_impl_link_destroy(struct pw_impl_link *link) pw_log_debug(NAME" %p: free", impl); pw_impl_link_emit_free(link); + spa_hook_list_clean(&link->listener_list); + pw_work_queue_destroy(impl->work); pw_properties_free(link->properties); diff --git a/src/pipewire/impl-module.c b/src/pipewire/impl-module.c index dd7d7040e..5b0f39660 100644 --- a/src/pipewire/impl-module.c +++ b/src/pipewire/impl-module.c @@ -322,6 +322,8 @@ void pw_impl_module_destroy(struct pw_impl_module *module) pw_properties_free(module->properties); + spa_hook_list_clean(&module->listener_list); + if (!pw_in_valgrind() && dlclose(impl->hnd) != 0) pw_log_warn(NAME" %p: dlclose failed: %s", module, dlerror()); free(impl); diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index 8dd616d47..61965a825 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -1680,6 +1680,8 @@ void pw_impl_node_destroy(struct pw_impl_node *node) pw_log_debug(NAME" %p: free", node); pw_impl_node_emit_free(node); + spa_hook_list_clean(&node->listener_list); + pw_memblock_unref(node->activation); pw_work_queue_destroy(impl->work); diff --git a/src/pipewire/impl-port.c b/src/pipewire/impl-port.c index f9a65a696..7dc4182e4 100644 --- a/src/pipewire/impl-port.c +++ b/src/pipewire/impl-port.c @@ -1018,6 +1018,8 @@ void pw_impl_port_destroy(struct pw_impl_port *port) pw_log_debug(NAME" %p: free", port); pw_impl_port_emit_free(port); + spa_hook_list_clean(&port->listener_list); + pw_buffers_clear(&port->buffers); pw_buffers_clear(&port->mix_buffers); free((void*)port->error); diff --git a/src/pipewire/main-loop.c b/src/pipewire/main-loop.c index 632983102..c2075b643 100644 --- a/src/pipewire/main-loop.c +++ b/src/pipewire/main-loop.c @@ -103,6 +103,8 @@ void pw_main_loop_destroy(struct pw_main_loop *loop) if (loop->created) pw_loop_destroy(loop->loop); + spa_hook_list_clean(&loop->listener_list); + free(loop); } diff --git a/src/pipewire/mem.c b/src/pipewire/mem.c index e21224d96..a55556ed2 100644 --- a/src/pipewire/mem.c +++ b/src/pipewire/mem.c @@ -181,6 +181,8 @@ void pw_mempool_destroy(struct pw_mempool *pool) spa_list_remove(&impl->link); + spa_hook_list_clean(&impl->listener_list); + pw_map_clear(&impl->map); if (pool->props) pw_properties_free(pool->props); diff --git a/src/pipewire/protocol.c b/src/pipewire/protocol.c index b743dc285..677de1d5e 100644 --- a/src/pipewire/protocol.c +++ b/src/pipewire/protocol.c @@ -109,6 +109,8 @@ void pw_protocol_destroy(struct pw_protocol *protocol) pw_log_debug(NAME" %p: destroy", protocol); pw_protocol_emit_destroy(protocol); + spa_hook_list_clean(&protocol->listener_list); + spa_list_remove(&protocol->link); spa_list_consume(server, &protocol->server_list, link) diff --git a/src/pipewire/resource.c b/src/pipewire/resource.c index 5bc0a8d22..9d7959038 100644 --- a/src/pipewire/resource.c +++ b/src/pipewire/resource.c @@ -281,6 +281,9 @@ void pw_resource_destroy(struct pw_resource *resource) pw_log_debug(NAME" %p: free %u", resource, resource->id); + spa_hook_list_clean(&resource->listener_list); + spa_hook_list_clean(&resource->object_listener_list); + free(resource); } diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index f6aca0b4d..cb7c0d7dc 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -1305,6 +1305,9 @@ void pw_stream_destroy(struct pw_stream *stream) free(c); } + spa_hook_list_clean(&impl->hooks); + spa_hook_list_clean(&stream->listener_list); + spa_hook_remove(&impl->context_listener); if (impl->data.context) diff --git a/src/pipewire/thread-loop.c b/src/pipewire/thread-loop.c index c931136a4..e878d8722 100644 --- a/src/pipewire/thread-loop.c +++ b/src/pipewire/thread-loop.c @@ -198,6 +198,8 @@ void pw_thread_loop_destroy(struct pw_thread_loop *loop) spa_hook_remove(&loop->hook); + spa_hook_list_clean(&loop->listener_list); + pw_loop_destroy_source(loop->loop, loop->event); if (loop->created) diff --git a/src/tests/test-endpoint.c b/src/tests/test-endpoint.c index a3f9bec13..60b2cc463 100644 --- a/src/tests/test-endpoint.c +++ b/src/tests/test-endpoint.c @@ -239,6 +239,7 @@ endpoint_init(struct endpoint * self) static void endpoint_clear(struct endpoint * self) { + spa_hook_list_clean(&self->hooks); pw_properties_free(self->properties); }