[gnome-builder/gnome-builder-43] plugins/ctags: use IdeObject::destroyed for life-cycle management



commit 0e74346994dd749f4dae8256030ea7f9c596853e
Author: Christian Hergert <chergert redhat com>
Date:   Mon Sep 26 17:30:10 2022 -0700

    plugins/ctags: use IdeObject::destroyed for life-cycle management
    
    This makes it so we don't have to track the service from the utility
    classes, nor do we need to manually unregister them or hold extra
    references for them which would cause cycles.
    
    Instead, we just watch for both of these object's destroy signal from the
    IdeObject superclass and unregister them manually.
    
    Fixes #1811

 src/plugins/ctags/ide-ctags-completion-provider.c | 15 -----
 src/plugins/ctags/ide-ctags-highlighter.c         | 12 +---
 src/plugins/ctags/ide-ctags-service.c             | 77 +++++++++++++++--------
 src/plugins/ctags/ide-ctags-service.h             |  4 --
 4 files changed, 53 insertions(+), 55 deletions(-)
---
diff --git a/src/plugins/ctags/ide-ctags-completion-provider.c 
b/src/plugins/ctags/ide-ctags-completion-provider.c
index 76b0a2ae9..982014b7c 100644
--- a/src/plugins/ctags/ide-ctags-completion-provider.c
+++ b/src/plugins/ctags/ide-ctags-completion-provider.c
@@ -135,20 +135,6 @@ ide_ctags_completion_provider_add_index (IdeCtagsCompletionProvider *self,
   g_ptr_array_add (self->indexes, g_object_ref (index));
 }
 
-static void
-ide_ctags_completion_provider_dispose (GObject *object)
-{
-  IdeCtagsCompletionProvider *self = (IdeCtagsCompletionProvider *)object;
-  g_autoptr(IdeCtagsService) service = NULL;
-  IdeContext *context;
-
-  if ((context = ide_object_get_context (IDE_OBJECT (self))) &&
-      (service = ide_object_get_child_typed (IDE_OBJECT (context), IDE_TYPE_CTAGS_SERVICE)))
-    ide_ctags_service_unregister_completion (service, self);
-
-  G_OBJECT_CLASS (ide_ctags_completion_provider_parent_class)->dispose (object);
-}
-
 static void
 ide_ctags_completion_provider_finalize (GObject *object)
 {
@@ -191,7 +177,6 @@ ide_ctags_completion_provider_class_init (IdeCtagsCompletionProviderClass *klass
     "union", "while",
   };
 
-  object_class->dispose = ide_ctags_completion_provider_dispose;
   object_class->finalize = ide_ctags_completion_provider_finalize;
 
   i_object_class->parent_set = ide_ctags_completion_provider_parent_set;
diff --git a/src/plugins/ctags/ide-ctags-highlighter.c b/src/plugins/ctags/ide-ctags-highlighter.c
index d624553ec..36b31f38f 100644
--- a/src/plugins/ctags/ide-ctags-highlighter.c
+++ b/src/plugins/ctags/ide-ctags-highlighter.c
@@ -32,7 +32,6 @@ struct _IdeCtagsHighlighter
   IdeObject           parent_instance;
 
   GPtrArray          *indexes;
-  IdeCtagsService    *service;
   IdeHighlightEngine *engine;
 };
 
@@ -280,10 +279,7 @@ ide_ctags_highlighter_real_set_engine (IdeHighlighter      *highlighter,
 
   if ((context = ide_object_get_context (IDE_OBJECT (self))) &&
       (service = ide_object_get_child_typed (IDE_OBJECT (context), IDE_TYPE_CTAGS_SERVICE)))
-    {
-      g_set_weak_pointer (&self->service, service);
-      ide_ctags_service_register_highlighter (service, self);
-    }
+    ide_ctags_service_register_highlighter (service, self);
 }
 
 static void
@@ -291,12 +287,6 @@ ide_ctags_highlighter_finalize (GObject *object)
 {
   IdeCtagsHighlighter *self = (IdeCtagsHighlighter *)object;
 
-  if (self->service != NULL)
-    {
-      ide_ctags_service_unregister_highlighter (self->service, self);
-      g_clear_weak_pointer (&self->service);
-    }
-
   g_clear_pointer (&self->indexes, g_ptr_array_unref);
 
   G_OBJECT_CLASS (ide_ctags_highlighter_parent_class)->finalize (object);
diff --git a/src/plugins/ctags/ide-ctags-service.c b/src/plugins/ctags/ide-ctags-service.c
index 16648018c..2242e9438 100644
--- a/src/plugins/ctags/ide-ctags-service.c
+++ b/src/plugins/ctags/ide-ctags-service.c
@@ -290,7 +290,7 @@ ide_ctags_service_tags_loaded_cb (GObject      *object,
   IdeTaskCache *cache = (IdeTaskCache *)object;
   g_autoptr(IdeCtagsService) self = user_data;
   g_autoptr(IdeCtagsIndex) index = NULL;
-  GError *error = NULL;
+  g_autoptr(GError) error = NULL;
 
   IDE_ENTRY;
 
@@ -303,8 +303,6 @@ ide_ctags_service_tags_loaded_cb (GObject      *object,
       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NONE))
         g_debug ("%s", error->message);
 
-      g_clear_error (&error);
-
       IDE_EXIT;
     }
 
@@ -865,35 +863,66 @@ ide_ctags_service_get_indexes (IdeCtagsService *self)
   return ide_task_cache_get_values (self->indexes);
 }
 
+static void
+ide_ctags_service_highlighter_destroyed_cb (IdeCtagsService     *self,
+                                            IdeCtagsHighlighter *highlighter)
+{
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_CTAGS_SERVICE (self));
+  g_assert (IDE_IS_CTAGS_HIGHLIGHTER (highlighter));
+
+  if (self->highlighters != NULL)
+    g_ptr_array_remove (self->highlighters, highlighter);
+
+  IDE_EXIT;
+}
+
 void
 ide_ctags_service_register_highlighter (IdeCtagsService     *self,
                                         IdeCtagsHighlighter *highlighter)
 {
   g_autoptr(GPtrArray) values = NULL;
-  gsize i;
 
+  IDE_ENTRY;
+
+  g_return_if_fail (IDE_IS_MAIN_THREAD ());
   g_return_if_fail (IDE_IS_CTAGS_SERVICE (self));
   g_return_if_fail (IDE_IS_CTAGS_HIGHLIGHTER (highlighter));
 
+  g_ptr_array_add (self->highlighters, highlighter);
+  g_signal_connect_object (highlighter,
+                           "destroy",
+                           G_CALLBACK (ide_ctags_service_highlighter_destroyed_cb),
+                           self,
+                           G_CONNECT_SWAPPED);
+
   values = ide_task_cache_get_values (self->indexes);
 
-  for (i = 0; i < values->len; i++)
+  for (guint i = 0; i < values->len; i++)
     {
       IdeCtagsIndex *index = g_ptr_array_index (values, i);
       ide_ctags_highlighter_add_index (highlighter, index);
     }
 
-  g_ptr_array_add (self->highlighters, highlighter);
+  IDE_EXIT;
 }
 
-void
-ide_ctags_service_unregister_highlighter (IdeCtagsService     *self,
-                                          IdeCtagsHighlighter *highlighter)
+static void
+ide_ctags_service_completion_destroyed_cb (IdeCtagsService            *self,
+                                           IdeCtagsCompletionProvider *completion)
 {
-  g_return_if_fail (IDE_IS_CTAGS_SERVICE (self));
-  g_return_if_fail (IDE_IS_CTAGS_HIGHLIGHTER (highlighter));
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_CTAGS_SERVICE (self));
+  g_assert (IDE_IS_CTAGS_COMPLETION_PROVIDER (completion));
 
-  g_ptr_array_remove (self->highlighters, highlighter);
+  if (self->completions != NULL)
+    g_ptr_array_remove (self->completions, completion);
+
+  IDE_EXIT;
 }
 
 void
@@ -901,30 +930,28 @@ ide_ctags_service_register_completion (IdeCtagsService            *self,
                                        IdeCtagsCompletionProvider *completion)
 {
   g_autoptr(GPtrArray) values = NULL;
-  gsize i;
+
+  IDE_ENTRY;
 
   g_return_if_fail (IDE_IS_CTAGS_SERVICE (self));
   g_return_if_fail (IDE_IS_CTAGS_COMPLETION_PROVIDER (completion));
 
+  g_ptr_array_add (self->completions, completion);
+  g_signal_connect_object (completion,
+                           "destroy",
+                           G_CALLBACK (ide_ctags_service_completion_destroyed_cb),
+                           self,
+                           G_CONNECT_SWAPPED);
+
   values = ide_task_cache_get_values (self->indexes);
 
-  for (i = 0; i < values->len; i++)
+  for (guint i = 0; i < values->len; i++)
     {
       IdeCtagsIndex *index = g_ptr_array_index (values, i);
       ide_ctags_completion_provider_add_index (completion, index);
     }
 
-  g_ptr_array_add (self->completions, completion);
-}
-
-void
-ide_ctags_service_unregister_completion (IdeCtagsService            *self,
-                                         IdeCtagsCompletionProvider *completion)
-{
-  g_return_if_fail (IDE_IS_CTAGS_SERVICE (self));
-  g_return_if_fail (IDE_IS_CTAGS_COMPLETION_PROVIDER (completion));
-
-  g_ptr_array_remove (self->completions, completion);
+  IDE_EXIT;
 }
 
 void
diff --git a/src/plugins/ctags/ide-ctags-service.h b/src/plugins/ctags/ide-ctags-service.h
index cf273f442..801f76072 100644
--- a/src/plugins/ctags/ide-ctags-service.h
+++ b/src/plugins/ctags/ide-ctags-service.h
@@ -33,12 +33,8 @@ G_DECLARE_FINAL_TYPE (IdeCtagsService, ide_ctags_service, IDE, CTAGS_SERVICE, Id
 
 void       ide_ctags_service_register_highlighter   (IdeCtagsService            *self,
                                                      IdeCtagsHighlighter        *highlighter);
-void       ide_ctags_service_unregister_highlighter (IdeCtagsService            *self,
-                                                     IdeCtagsHighlighter        *highlighter);
 void       ide_ctags_service_register_completion    (IdeCtagsService            *self,
                                                      IdeCtagsCompletionProvider *completion);
-void       ide_ctags_service_unregister_completion  (IdeCtagsService            *self,
-                                                     IdeCtagsCompletionProvider *completion);
 void       ide_ctags_service_pause                  (IdeCtagsService            *self);
 void       ide_ctags_service_unpause                (IdeCtagsService            *self);
 GPtrArray *ide_ctags_service_get_indexes            (IdeCtagsService            *self);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]