lib: remove some listeners

This commit is contained in:
Wim Taymans 2022-02-09 12:37:03 +01:00
parent 5f96f69218
commit 88d9b30d7a
3 changed files with 10 additions and 0 deletions

View file

@ -244,6 +244,8 @@ proxy_core_destroy (void *data)
WpCore *self = WP_CORE (data);
g_hash_table_foreach_remove (self->async_tasks, async_tasks_finish, NULL);
g_clear_pointer (&self->info, pw_core_info_free);
spa_hook_remove(&self->core_listener);
spa_hook_remove(&self->proxy_core_listener);
self->pw_core = NULL;
wp_debug_object (self, "emit disconnected");
g_signal_emit (self, signals[SIGNAL_DISCONNECTED], 0);

View file

@ -137,6 +137,7 @@ struct _WpMetadataPrivate
struct pw_metadata *iface;
struct spa_hook listener;
struct pw_array metadata;
gboolean remove_listener;
};
G_DEFINE_TYPE_WITH_PRIVATE (WpMetadata, wp_metadata, WP_TYPE_GLOBAL_PROXY)
@ -274,6 +275,7 @@ wp_metadata_pw_proxy_created (WpProxy * proxy, struct pw_proxy * pw_proxy)
priv->iface = (struct pw_metadata *) pw_proxy;
pw_metadata_add_listener (priv->iface, &priv->listener,
&metadata_events, self);
priv->remove_listener = TRUE;
wp_core_sync (core, NULL, (GAsyncReadyCallback) initial_sync_done, self);
}
@ -283,6 +285,10 @@ wp_metadata_pw_proxy_destroyed (WpProxy * proxy)
WpMetadata *self = WP_METADATA (proxy);
WpMetadataPrivate *priv = wp_metadata_get_instance_private (self);
if (priv->remove_listener) {
spa_hook_remove (&priv->listener);
priv->remove_listener = FALSE;
}
clear_items (&priv->metadata);
wp_object_update_features (WP_OBJECT (self), 0, WP_METADATA_FEATURE_DATA);

View file

@ -356,6 +356,7 @@ static void
wp_pw_object_mixin_data_free (gpointer data)
{
WpPwObjectMixinData *d = data;
spa_hook_list_clean (&d->hooks);
g_clear_pointer (&d->properties, wp_properties_unref);
g_list_free_full (d->params, wp_pw_object_mixin_param_store_free);
g_clear_pointer (&d->subscribed_ids, g_array_unref);
@ -683,6 +684,7 @@ wp_pw_object_mixin_handle_pw_proxy_destroyed (WpProxy * proxy)
WpPwObjectMixinPrivInterface *iface =
WP_PW_OBJECT_MIXIN_PRIV_GET_IFACE (proxy);
spa_hook_remove (&d->listener);
g_clear_pointer (&d->properties, wp_properties_unref);
g_clear_pointer (&d->info, iface->free_info);
d->iface = NULL;