[gnome-builder] gobject: avoid ref'ing class/iface when we can peek



commit 3cf0f239642b008120187205b1ac0dcef0c3c42b
Author: Christian Hergert <chergert redhat com>
Date:   Wed Jul 11 11:52:01 2018 +0200

    gobject: avoid ref'ing class/iface when we can peek

 src/libide/buildsystem/ide-build-pipeline.c        | 16 ++++++++++------
 src/libide/gsettings/ide-gsettings-file-settings.c | 10 +++++++---
 src/libide/plugins/ide-extension-util.c            | 14 ++++++++------
 src/libide/sourceview/ide-source-view-movements.c  |  7 ++++---
 4 files changed, 29 insertions(+), 18 deletions(-)
---
diff --git a/src/libide/buildsystem/ide-build-pipeline.c b/src/libide/buildsystem/ide-build-pipeline.c
index 03a3799c1..faf948c8f 100644
--- a/src/libide/buildsystem/ide-build-pipeline.c
+++ b/src/libide/buildsystem/ide-build-pipeline.c
@@ -2307,7 +2307,7 @@ ide_build_pipeline_connect (IdeBuildPipeline *self,
                             gint              priority,
                             IdeBuildStage    *stage)
 {
-  GFlagsClass *klass;
+  GFlagsClass *klass, *unref_class = NULL;
   guint ret = 0;
 
   IDE_ENTRY;
@@ -2319,7 +2319,8 @@ ide_build_pipeline_connect (IdeBuildPipeline *self,
                         (phase & IDE_BUILD_PHASE_WHENCE_MASK) == IDE_BUILD_PHASE_BEFORE ||
                         (phase & IDE_BUILD_PHASE_WHENCE_MASK) == IDE_BUILD_PHASE_AFTER, 0);
 
-  klass = g_type_class_ref (IDE_TYPE_BUILD_PHASE);
+  if (!(klass = g_type_class_peek (IDE_TYPE_BUILD_PHASE)))
+    klass = unref_class = g_type_class_ref (IDE_TYPE_BUILD_PHASE);
 
   for (guint i = 0; i < klass->n_values; i++)
     {
@@ -2373,7 +2374,8 @@ ide_build_pipeline_connect (IdeBuildPipeline *self,
   g_warning ("No such pipeline phase %02x", phase);
 
 cleanup:
-  g_type_class_unref (klass);
+  if (unref_class != NULL)
+    g_type_class_unref (unref_class);
 
   IDE_RETURN (ret);
 }
@@ -2428,7 +2430,7 @@ gboolean
 ide_build_pipeline_request_phase (IdeBuildPipeline *self,
                                   IdeBuildPhase     phase)
 {
-  GFlagsClass *klass;
+  GFlagsClass *klass, *unref_class = NULL;
   gboolean ret = FALSE;
 
   IDE_ENTRY;
@@ -2442,7 +2444,8 @@ ide_build_pipeline_request_phase (IdeBuildPipeline *self,
    */
   phase &= IDE_BUILD_PHASE_MASK;
 
-  klass = g_type_class_ref (IDE_TYPE_BUILD_PHASE);
+  if (!(klass = g_type_class_peek (IDE_TYPE_BUILD_PHASE)))
+    klass = unref_class = g_type_class_ref (IDE_TYPE_BUILD_PHASE);
 
   for (guint i = 0; i < klass->n_values; i++)
     {
@@ -2487,7 +2490,8 @@ cleanup:
         }
     }
 
-  g_type_class_unref (klass);
+  if (unref_class != NULL)
+    g_type_class_unref (unref_class);
 
   IDE_RETURN (ret);
 }
diff --git a/src/libide/gsettings/ide-gsettings-file-settings.c 
b/src/libide/gsettings/ide-gsettings-file-settings.c
index 0e114368b..be12a9d24 100644
--- a/src/libide/gsettings/ide-gsettings-file-settings.c
+++ b/src/libide/gsettings/ide-gsettings-file-settings.c
@@ -67,9 +67,12 @@ spaces_style_get (GValue   *value,
                   gpointer  user_data)
 {
   g_autofree const gchar **strv = g_variant_get_strv (variant, NULL);
-  GFlagsClass *klass = g_type_class_ref (IDE_TYPE_SPACES_STYLE);
+  GFlagsClass *klass, *unref_class = NULL;
   guint flags = 0;
 
+  if (!(klass = g_type_class_peek (IDE_TYPE_SPACES_STYLE)))
+    klass = unref_class = g_type_class_ref (IDE_TYPE_SPACES_STYLE);
+
   for (guint i = 0; strv[i] != NULL; i++)
     {
       GFlagsValue *val = g_flags_get_value_by_nick (klass, strv[i]);
@@ -83,10 +86,11 @@ spaces_style_get (GValue   *value,
       flags |= val->value;
     }
 
-  g_type_class_unref (klass);
-
   g_value_set_flags (value, flags);
 
+  if (unref_class != NULL)
+    g_type_class_unref (unref_class);
+
   return TRUE;
 }
 
diff --git a/src/libide/plugins/ide-extension-util.c b/src/libide/plugins/ide-extension-util.c
index 4f7f2df2b..45bf18c66 100644
--- a/src/libide/plugins/ide-extension-util.c
+++ b/src/libide/plugins/ide-extension-util.c
@@ -134,8 +134,8 @@ find_property_type (GType        type,
   for (guint i = 0; i < types->len; i++)
     {
       GType prereq_type = g_array_index (types, GType, i);
-      GObjectClass *klass = NULL;
-      GTypeInterface *iface = NULL;
+      GObjectClass *klass, *unref_class = NULL;
+      GTypeInterface *iface, *unref_iface = NULL;
       GParamSpec *pspec = NULL;
       GType ret = G_TYPE_INVALID;
 
@@ -147,12 +147,14 @@ find_property_type (GType        type,
 
       if (G_TYPE_IS_OBJECT (prereq_type))
         {
-          klass = g_type_class_ref (prereq_type);
+          if (!(klass = g_type_class_peek (prereq_type)))
+            klass = unref_class = g_type_class_ref (prereq_type);
           pspec = g_object_class_find_property (klass, name);
         }
       else if (G_TYPE_IS_INTERFACE (prereq_type))
         {
-          iface = g_type_default_interface_ref (prereq_type);
+          if (!(iface = g_type_default_interface_peek (prereq_type)))
+            iface = unref_iface = g_type_default_interface_ref (prereq_type);
           pspec = g_object_interface_find_property (iface, name);
         }
       else
@@ -161,8 +163,8 @@ find_property_type (GType        type,
       if (pspec != NULL)
         ret = pspec->value_type;
 
-      dzl_clear_pointer (&klass, g_type_class_unref);
-      dzl_clear_pointer (&iface, g_type_default_interface_unref);
+      dzl_clear_pointer (&unref_class, g_type_class_unref);
+      dzl_clear_pointer (&unref_iface, g_type_default_interface_unref);
 
       if (ret != G_TYPE_INVALID)
         return ret;
diff --git a/src/libide/sourceview/ide-source-view-movements.c 
b/src/libide/sourceview/ide-source-view-movements.c
index c09114b78..ee2e26ede 100644
--- a/src/libide/sourceview/ide-source-view-movements.c
+++ b/src/libide/sourceview/ide-source-view-movements.c
@@ -1998,16 +1998,17 @@ _ide_source_view_apply_movement (IdeSourceView         *self,
 #ifdef IDE_ENABLE_TRACE
   {
     GEnumValue *enum_value;
-    GEnumClass *enum_class;
+    GEnumClass *enum_class, *enum_class_unref = NULL;
 
-    enum_class = g_type_class_ref (IDE_TYPE_SOURCE_VIEW_MOVEMENT);
+    if (!(enum_class = g_type_class_peek (IDE_TYPE_SOURCE_VIEW_MOVEMENT)))
+      enum_class = enum_class_unref = g_type_class_ref (IDE_TYPE_SOURCE_VIEW_MOVEMENT);
     enum_value = g_enum_get_value (enum_class, movement);
     IDE_TRACE_MSG ("movement(%s, extend_selection=%s, exclusive=%s, count=%u)",
                    enum_value->value_nick,
                    extend_selection ? "YES" : "NO",
                    exclusive ? "YES" : "NO",
                    count);
-    g_type_class_unref (enum_class);
+    dzl_clear_pointer (&enum_class_unref, g_type_class_unref);
   }
 #endif
 


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