From 19551ac983b676daff3665add259e9bf59b0fbc8 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 19 May 2022 21:53:31 -0400 Subject: [PATCH] Avoid g_type_class_peek Most of the time, properties belong to the class we set them on. Check that first, before going into GType, which takes locks and whatnot. --- gobject/gobject.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/gobject/gobject.c b/gobject/gobject.c index 3348426a8..a7d88da15 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -1546,16 +1546,17 @@ object_get_property (GObject *object, GParamSpec *pspec, GValue *value) { - GObjectClass *class = g_type_class_peek (pspec->owner_type); + GTypeInstance *inst = (GTypeInstance *) object; + GObjectClass *class; guint param_id = PARAM_SPEC_PARAM_ID (pspec); GParamSpec *redirect; - if (class == NULL) - { - g_warning ("'%s::%s' is not a valid property name; '%s' is not a GObject subtype", - g_type_name (pspec->owner_type), pspec->name, g_type_name (pspec->owner_type)); - return; - } + if (G_LIKELY (inst->g_class->g_type == pspec->owner_type)) + class = (GObjectClass *) inst->g_class; + else + class = g_type_class_peek (pspec->owner_type); + + g_assert (class != NULL); redirect = g_param_spec_get_redirect_target (pspec); if (redirect) @@ -1572,17 +1573,18 @@ object_set_property (GObject *object, const GValue *value, GObjectNotifyQueue *nqueue) { - GObjectClass *class = g_type_class_peek (pspec->owner_type); + GTypeInstance *inst = (GTypeInstance *) object; + GObjectClass *class; GParamSpecClass *pclass; guint param_id = PARAM_SPEC_PARAM_ID (pspec); GParamSpec *redirect; - if (G_UNLIKELY (class == NULL)) - { - g_warning ("'%s::%s' is not a valid property name; '%s' is not a GObject subtype", - g_type_name (pspec->owner_type), pspec->name, g_type_name (pspec->owner_type)); - return; - } + if (G_LIKELY (inst->g_class->g_type == pspec->owner_type)) + class = (GObjectClass *) inst->g_class; + else + class = g_type_class_peek (pspec->owner_type); + + g_assert (class != NULL); redirect = g_param_spec_get_redirect_target (pspec); if (redirect)