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.
This commit is contained in:
Wim Taymans 2020-11-06 15:55:33 +01:00
parent 1570e62635
commit a2549fc638
21 changed files with 47 additions and 0 deletions

View file

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

View file

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

View file

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

View file

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

View file

@ -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)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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)

View file

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

View file

@ -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)

View file

@ -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)

View file

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