Reorganize g_type_class_ref()
authorEdward Hervey <bilboed@bilboed.com>
Thu, 24 Sep 2009 10:29:25 +0000 (12:29 +0200)
committerAlexander Larsson <alexl@redhat.com>
Mon, 30 Nov 2009 19:52:33 +0000 (20:52 +0100)
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

index 83e4b1d..9c7e2e9 100644 (file)
@@ -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)
-    {
-      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))
+  if (!node || !node->is_classed)
     {
-      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);