[glib/gobject-speedups: 8/13] Avoid property notification during object construction
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/gobject-speedups: 8/13] Avoid property notification during object construction
- Date: Mon, 16 May 2022 11:07:58 +0000 (UTC)
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]