From 5160175656797fde6b301b0d832b692052b96e3e Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 24 Sep 2009 12:29:25 +0200 Subject: [PATCH] Reorganize g_type_class_ref() Moves the first check out of the lock, as it's not required. https://bugzilla.gnome.org/show_bug.cgi?id=585375 --- gobject/gtype.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/gobject/gtype.c b/gobject/gtype.c index 83e4b1d15..9c7e2e97b 100644 --- a/gobject/gtype.c +++ b/gobject/gtype.c @@ -2818,24 +2818,21 @@ g_type_class_ref (GType type) GType ptype; /* optimize for common code path */ - G_WRITE_LOCK (&type_rw_lock); node = lookup_type_node_I (type); - if (node && node->is_classed && node->data && - g_atomic_int_get (&node->data->class.init_state) == INITIALIZED) + if (!node || !node->is_classed) { - type_data_ref_Wm (node); - G_WRITE_UNLOCK (&type_rw_lock); - return node->data->class.class; - } - if (!node || !node->is_classed || - (node->data && NODE_REFCOUNT (node) == 0)) - { - G_WRITE_UNLOCK (&type_rw_lock); g_warning ("cannot retrieve class for invalid (unclassed) type `%s'", type_descriptive_name_I (type)); return NULL; } + + G_WRITE_LOCK (&type_rw_lock); type_data_ref_Wm (node); + if (g_atomic_int_get (&node->data->class.init_state) == INITIALIZED) + { + G_WRITE_UNLOCK (&type_rw_lock); + return node->data->class.class; + } ptype = NODE_PARENT_TYPE (node); G_WRITE_UNLOCK (&type_rw_lock);