[glib/gobject-speedups: 20/23] Avoid g_object_ref/unref in some cases




commit 7c703d6c107c49a6d82a54bf245d0fd1c8179528
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue May 17 07:11:19 2022 -0400

    Avoid g_object_ref/unref in some cases
    
    We only need to take a ref on the object when
    we call out to external code (ie around
    ->dispatch_properties_changed). If we avoid
    the signal emission, we can avoid the ref/unref
    too.

 gobject/gobject.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index 8f3e3edd35..c0d77c5542 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -1354,9 +1354,15 @@ g_object_notify_by_spec_internal (GObject    *object,
           g_object_notify_queue_thaw (object, nqueue);
         }
       else
-        /* not frozen, so just dispatch the notification directly */
-        G_OBJECT_GET_CLASS (object)
-          ->dispatch_properties_changed (object, 1, &pspec);
+        {
+          g_object_ref (object);
+
+          /* not frozen, so just dispatch the notification directly */
+          G_OBJECT_GET_CLASS (object)
+            ->dispatch_properties_changed (object, 1, &pspec);
+
+          g_object_unref (object);
+        }
     }
 }
 
@@ -1387,7 +1393,6 @@ g_object_notify (GObject     *object,
   if (g_atomic_int_get (&object->ref_count) == 0)
     return;
   
-  g_object_ref (object);
   /* We don't need to get the redirect target
    * (by, e.g. calling g_object_class_find_property())
    * because g_object_notify_queue_add() does that
@@ -1404,7 +1409,6 @@ g_object_notify (GObject     *object,
               property_name);
   else
     g_object_notify_by_spec_internal (object, pspec);
-  g_object_unref (object);
 }
 
 /**
@@ -1463,9 +1467,7 @@ g_object_notify_by_pspec (GObject    *object,
   if (g_atomic_int_get (&object->ref_count) == 0)
     return;
 
-  g_object_ref (object);
   g_object_notify_by_spec_internal (object, pspec);
-  g_object_unref (object);
 }
 
 /**


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