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); }