[glib/gobject-performance] type_data_unref_Wm => type_data_unref_U



commit 37ac953f8128f98788026ec98c8ac33966bd5f4b
Author: Edward Hervey <bilboed bilboed com>
Date:   Thu Sep 24 11:19:58 2009 +0200

    type_data_unref_Wm => type_data_unref_U
    
    Make the type unref function not hold any locks when called. This
    makes it easier to optimize it to be atomic later.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=585375

 gobject/gtype.c |   37 ++++++++++++++-----------------------
 1 files changed, 14 insertions(+), 23 deletions(-)
---
diff --git a/gobject/gtype.c b/gobject/gtype.c
index 8e12557..e7800fe 100644
--- a/gobject/gtype.c
+++ b/gobject/gtype.c
@@ -185,7 +185,7 @@ static	      void			type_data_make_W		(TypeNode		*node,
 									 const GTypeInfo	*info,
 									 const GTypeValueTable	*value_table);
 static inline void			type_data_ref_Wm		(TypeNode		*node);
-static inline void			type_data_unref_WmREC		(TypeNode		*node,
+static inline void			type_data_unref_U               (TypeNode		*node,
 									 gboolean		 uncached);
 static void				type_data_last_unref_Wm		(TypeNode *              node,
 									 gboolean		 uncached);
@@ -1678,9 +1678,8 @@ type_iface_blow_holder_info_Wm (TypeNode *iface,
       
       G_WRITE_UNLOCK (&type_rw_lock);
       g_type_plugin_unuse (iholder->plugin);
+      type_data_unref_U (iface, FALSE);
       G_WRITE_LOCK (&type_rw_lock);
-      
-      type_data_unref_WmREC (iface, FALSE);
     }
 }
 
@@ -2336,16 +2335,17 @@ type_data_last_unref_Wm (TypeNode *node,
       
       G_WRITE_UNLOCK (&type_rw_lock);
       g_type_plugin_unuse (node->plugin);
-      G_WRITE_LOCK (&type_rw_lock);
       if (ptype)
-	type_data_unref_WmREC (lookup_type_node_I (ptype), FALSE);
+	type_data_unref_U (lookup_type_node_I (ptype), FALSE);
+      G_WRITE_LOCK (&type_rw_lock);
     }
 }
 
 static inline void
-type_data_unref_WmREC (TypeNode *node,
-                       gboolean  uncached)
+type_data_unref_U (TypeNode *node,
+                   gboolean  uncached)
 {
+  G_WRITE_LOCK (&type_rw_lock);
   g_assert (node->data && NODE_REFCOUNT (node) > 0);
   if (NODE_REFCOUNT (node) > 1)
     node->ref_count -= 1;
@@ -2363,6 +2363,7 @@ type_data_unref_WmREC (TypeNode *node,
       type_data_last_unref_Wm (node, uncached);
       g_static_rec_mutex_unlock (&class_init_rec_mutex);
     }
+  G_WRITE_UNLOCK (&type_rw_lock);
 }
 
 /**
@@ -2872,14 +2873,11 @@ g_type_class_unref (gpointer g_class)
   g_return_if_fail (g_class != NULL);
   
   node = lookup_type_node_I (class->g_type);
-  G_WRITE_LOCK (&type_rw_lock);
-  if (node && node->is_classed && node->data &&
-      node->data->class.class == class && NODE_REFCOUNT (node) > 0)
-    type_data_unref_WmREC (node, FALSE);
+  if (node && node->is_classed && node->data)
+    type_data_unref_U (node, FALSE);
   else
     g_warning ("cannot unreference class of invalid (unclassed) type `%s'",
 	       type_descriptive_name_I (class->g_type));
-  G_WRITE_UNLOCK (&type_rw_lock);
 }
 
 /**
@@ -2899,15 +2897,12 @@ g_type_class_unref_uncached (gpointer g_class)
   
   g_return_if_fail (g_class != NULL);
   
-  G_WRITE_LOCK (&type_rw_lock);
   node = lookup_type_node_I (class->g_type);
-  if (node && node->is_classed && node->data &&
-      node->data->class.class == class && NODE_REFCOUNT (node) > 0)
-    type_data_unref_WmREC (node, TRUE);
+  if (node && node->is_classed && node->data)
+    type_data_unref_U (node, TRUE);
   else
     g_warning ("cannot unreference class of invalid (unclassed) type `%s'",
 	       type_descriptive_name_I (class->g_type));
-  G_WRITE_UNLOCK (&type_rw_lock);
 }
 
 /**
@@ -3188,15 +3183,11 @@ g_type_default_interface_unref (gpointer g_iface)
   g_return_if_fail (g_iface != NULL);
   
   node = lookup_type_node_I (vtable->g_type);
-  G_WRITE_LOCK (&type_rw_lock);
-  if (node && NODE_IS_IFACE (node) &&
-      node->data->iface.dflt_vtable == g_iface &&
-      NODE_REFCOUNT (node) > 0)
-    type_data_unref_WmREC (node, FALSE);
+  if (node && NODE_IS_IFACE (node))
+    type_data_unref_U (node, FALSE);
   else
     g_warning ("cannot unreference invalid interface default vtable for '%s'",
 	       type_descriptive_name_I (vtable->g_type));
-  G_WRITE_UNLOCK (&type_rw_lock);
 }
 
 /**



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]