From ded3106efc09e2fab5c78f955fd362cc95986ae3 Mon Sep 17 00:00:00 2001 From: Julian Bouzas <julian.bouzas@collabora.com> Date: Wed, 26 Jun 2019 12:35:55 -0400 Subject: [PATCH] core: handle global references in a simpler way --- lib/wp/core.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/wp/core.c b/lib/wp/core.c index 82ae5146..34984c2b 100644 --- a/lib/wp/core.c +++ b/lib/wp/core.c @@ -32,9 +32,15 @@ struct _WpCore G_DEFINE_TYPE (WpCore, wp_core, G_TYPE_OBJECT) static void -free_global_object (gpointer g) +free_global_object (gpointer p) { - g_slice_free (struct global_object, g); + struct global_object *g = p; + + /* Destroy the object */ + if (g->destroy) + g->destroy(g->object); + + g_slice_free (struct global_object, p); } static void @@ -49,17 +55,15 @@ wp_core_dispose (GObject * obj) WpCore *self = WP_CORE (obj); g_autoptr (GPtrArray) global_objects; struct global_object *global; - gint i; global_objects = g_steal_pointer (&self->global_objects); - for (i = 0; i < global_objects->len; i++) { - global = g_ptr_array_index (global_objects, i); + /* Remove and emit the removed signal for all globals */ + while (global_objects->len > 0) { + global = g_ptr_array_steal_index_fast (global_objects, 0); g_signal_emit (self, signals[SIGNAL_GLOBAL_REMOVED], global->key, global->key, global->object); - - if (global->destroy) - global->destroy (global->object); + free_global_object (global); } G_OBJECT_CLASS (wp_core_parent_class)->dispose (obj); @@ -198,7 +202,6 @@ wp_core_remove_global (WpCore * self, GQuark key, gpointer obj) { gint i; struct global_object *global; - struct global_object tmp; g_return_if_fail (WP_IS_CORE (self)); @@ -212,15 +215,12 @@ wp_core_remove_global (WpCore * self, GQuark key, gpointer obj) } if (i < self->global_objects->len) { - tmp = *global; - - g_ptr_array_remove_index_fast (self->global_objects, i); + global = g_ptr_array_steal_index_fast (self->global_objects, i); g_signal_emit (self, signals[SIGNAL_GLOBAL_REMOVED], key, - key, tmp.object); + key, global->object); - if (tmp.destroy) - tmp.destroy (tmp.object); + free_global_object (global); } } -- GitLab