[gnome-builder] gobject: avoid ref'ing class/iface when we can peek
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] gobject: avoid ref'ing class/iface when we can peek
- Date: Wed, 11 Jul 2018 10:04:01 +0000 (UTC)
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]