From f755f445c6e6a937998922c715f7d618834f8e9b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 15 May 2022 07:56:43 -0400 Subject: [PATCH] Avoid property notification during g_object_set If we have no nontrivial notify vfunc, and no signal handlers for notify, we don't need to maintain the notify queue. No need to notify if nobody's listening. --- gobject/gobject.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/gobject/gobject.c b/gobject/gobject.c index 6a8808cbc..b6fe8c9a9 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -1345,7 +1345,8 @@ g_object_notify_by_spec_internal (GObject *object, if (redirected != NULL) pspec = redirected; - if (pspec != NULL) + if (pspec != NULL && + _g_object_has_notify_handler (object)) { GObjectNotifyQueue *nqueue; @@ -2516,7 +2517,7 @@ g_object_setv (GObject *object, const GValue values[]) { guint i; - GObjectNotifyQueue *nqueue; + GObjectNotifyQueue *nqueue = NULL; GParamSpec *pspec; GType obj_type; @@ -2527,7 +2528,10 @@ g_object_setv (GObject *object, g_object_ref (object); obj_type = G_OBJECT_TYPE (object); - nqueue = g_object_notify_queue_freeze (object, FALSE); + + if (_g_object_has_notify_handler (object)) + nqueue = g_object_notify_queue_freeze (object, FALSE); + for (i = 0; i < n_properties; i++) { pspec = g_param_spec_pool_lookup (pspec_pool, names[i], obj_type, TRUE); @@ -2538,7 +2542,9 @@ g_object_setv (GObject *object, object_set_property (object, pspec, &values[i], nqueue); } - g_object_notify_queue_thaw (object, nqueue); + if (nqueue) + g_object_notify_queue_thaw (object, nqueue); + g_object_unref (object); } @@ -2556,14 +2562,16 @@ g_object_set_valist (GObject *object, const gchar *first_property_name, va_list var_args) { - GObjectNotifyQueue *nqueue; + GObjectNotifyQueue *nqueue = NULL; const gchar *name; g_return_if_fail (G_IS_OBJECT (object)); - + g_object_ref (object); - nqueue = g_object_notify_queue_freeze (object, FALSE); - + + if (_g_object_has_notify_handler (object)) + nqueue = g_object_notify_queue_freeze (object, FALSE); + name = first_property_name; while (name) { @@ -2600,7 +2608,9 @@ g_object_set_valist (GObject *object, name = va_arg (var_args, gchar*); } - g_object_notify_queue_thaw (object, nqueue); + if (nqueue) + g_object_notify_queue_thaw (object, nqueue); + g_object_unref (object); }