[glib/gobject-speedup11: 3/3] Avoid property notification during g_object_set
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/gobject-speedup11: 3/3] Avoid property notification during g_object_set
- Date: Mon, 6 Jun 2022 18:14:51 +0000 (UTC)
commit 6d6e231d7068d66bec864be4c9584a8f745f9def
Author: Matthias Clasen <mclasen redhat com>
Date: Sun May 15 07:56:43 2022 -0400
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 | 26 ++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index 2745be3d9b..c822b0eba2 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,13 +2562,15 @@ 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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]