[glib/gobject-speedups: 8/13] Avoid property notification during object construction




commit 4c4f372c3989386493bec9e668804ffcb741eb6c
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun May 15 07:53:46 2022 -0400

    Avoid property notification during object construction
    
    Check whether an object has a nontrivial notify vfunc
    and avoid creating and updating the notify queue if
    it doesn't. No need to notify if nobody's listening.

 gobject/gobject.c | 38 +++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 19 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index e6400c7ba3..27a070585b 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -1151,9 +1151,9 @@ g_object_init (GObject            *object,
   object->ref_count = 1;
   object->qdata = NULL;
 
-  if (CLASS_HAS_PROPS (class))
+  if (CLASS_HAS_PROPS (class) && CLASS_HAS_NOTIFY (class))
     {
-      /* freeze object's notification queue, g_object_newv() preserves pairedness */
+      /* freeze object's notification queue, g_object_new_internal() preserves pairedness */
       g_object_notify_queue_freeze (object, FALSE);
     }
 
@@ -1652,7 +1652,8 @@ object_set_property (GObject             *object,
       g_value_unset (&tmp_value);
     }
 
-  if ((pspec->flags & (G_PARAM_EXPLICIT_NOTIFY|G_PARAM_READABLE)) == G_PARAM_READABLE)
+  if ((pspec->flags & (G_PARAM_EXPLICIT_NOTIFY|G_PARAM_READABLE)) == G_PARAM_READABLE &&
+      nqueue != NULL)
     g_object_notify_queue_add (object, nqueue, pspec);
 }
 
@@ -2057,6 +2058,7 @@ g_object_new_internal (GObjectClass          *class,
 {
   GObjectNotifyQueue *nqueue = NULL;
   GObject *object;
+  guint i;
 
   if G_UNLIKELY (CLASS_HAS_CUSTOM_CONSTRUCTOR (class))
     return g_object_new_with_custom_constructor (class, params, n_params);
@@ -2069,9 +2071,12 @@ g_object_new_internal (GObjectClass          *class,
     {
       GSList *node;
 
-      /* This will have been setup in g_object_init() */
-      nqueue = g_datalist_id_get_data (&object->qdata, quark_notify_queue);
-      g_assert (nqueue != NULL);
+      if (CLASS_HAS_NOTIFY (class))
+        {
+          /* This will have been setup in g_object_init() */
+          nqueue = g_datalist_id_get_data (&object->qdata, quark_notify_queue);
+          g_assert (nqueue != NULL);
+        }
 
       /* We will set exactly n_construct_properties construct
        * properties, but they may come from either the class default
@@ -2104,20 +2109,15 @@ g_object_new_internal (GObjectClass          *class,
   if (CLASS_HAS_CUSTOM_CONSTRUCTED (class))
     class->constructed (object);
 
-  if (nqueue)
-    {
-      guint i;
-
-      /* Set remaining properties.  The construct properties will
-       * already have been taken, so set only the non-construct
-       * ones.
-       */
-      for (i = 0; i < n_params; i++)
-        if (!(params[i].pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)))
-          object_set_property (object, params[i].pspec, params[i].value, nqueue);
+  /* Set remaining properties.  The construct properties will
+   * already have been taken, so set only the non-construct ones.
+   */
+  for (i = 0; i < n_params; i++)
+    if (!(params[i].pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)))
+      object_set_property (object, params[i].pspec, params[i].value, nqueue);
 
-      g_object_notify_queue_thaw (object, nqueue);
-    }
+  if (nqueue)
+    g_object_notify_queue_thaw (object, nqueue);
 
   return object;
 }


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