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.
This commit is contained in:
Matthias Clasen 2022-05-15 07:56:43 -04:00
parent 8851112b8d
commit f755f445c6

View File

@ -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);
}