Bug#476207: Reassign to libglib2.0-0?

Matt Kraai kraai at ftbfs.org
Thu Apr 24 22:45:29 UTC 2008


Howdy,

I think this is a problem with GObject, since it should be able to
create multiple objects of the same class simultaneously.  I've
attached a patch that I believe will fix the problem (it does for me,
at least).

Would it be OK if I reassigned this bug to libglib2.0-0?

-- 
Matt
-------------- next part --------------
diff --git a/gobject/gtype.c b/gobject/gtype.c
index 8c8fc41..2fede91 100644
--- a/gobject/gtype.c
+++ b/gobject/gtype.c
@@ -2369,7 +2369,8 @@ g_type_class_ref (GType type)
   G_WRITE_LOCK (&type_rw_lock);
   node = lookup_type_node_I (type);
   if (node && node->is_classed && node->data &&
-      node->data->class.class && node->data->common.ref_count > 0)
+      node->data->class.init_state == INITIALIZED &&
+      node->data->common.ref_count > 0)
     {
       type_data_ref_Wm (node);
       G_WRITE_UNLOCK (&type_rw_lock);
@@ -2387,13 +2388,13 @@ g_type_class_ref (GType type)
     }
 
   type_data_ref_Wm (node);
+  G_WRITE_UNLOCK (&type_rw_lock);
+  g_static_rec_mutex_lock (&class_init_rec_mutex); /* required locking order: 1) class_init_rec_mutex, 2) type_rw_lock */
 
   if (!node->data->class.class) /* class uninitialized */
     {
       GType ptype = NODE_PARENT_TYPE (node);
       GTypeClass *pclass = NULL;
-      G_WRITE_UNLOCK (&type_rw_lock);
-      g_static_rec_mutex_lock (&class_init_rec_mutex); /* required locking order: 1) class_init_rec_mutex, 2) type_rw_lock */
       if (ptype)
         {
           pclass = g_type_class_ref (ptype);
@@ -2407,11 +2408,10 @@ g_type_class_ref (GType type)
           G_WRITE_LOCK (&type_rw_lock);
           node = lookup_type_node_I (type);
         }
-      if (!node->data->class.class) /* class could have been initialized meanwhile */
-        type_class_init_Wm (node, pclass);
+      type_class_init_Wm (node, pclass);
       G_WRITE_UNLOCK (&type_rw_lock);
-      g_static_rec_mutex_unlock (&class_init_rec_mutex);
     }
+  g_static_rec_mutex_unlock (&class_init_rec_mutex);
   return node->data->class.class;
 }
 
@@ -2461,7 +2461,8 @@ g_type_class_peek (GType type)
   
   node = lookup_type_node_I (type);
   G_READ_LOCK (&type_rw_lock);
-  if (node && node->is_classed && node->data && node->data->class.class) /* common.ref_count _may_ be 0 */
+  if (node && node->is_classed && node->data &&
+      node->data->class.init_state == INITIALIZED) /* common.ref_count _may_ be 0 */
     class = node->data->class.class;
   else
     class = NULL;
@@ -2480,7 +2481,7 @@ g_type_class_peek_static (GType type)
   G_READ_LOCK (&type_rw_lock);
   if (node && node->is_classed && node->data &&
       /* peek only static types: */ node->plugin == NULL &&
-      node->data->class.class) /* common.ref_count _may_ be 0 */
+      node->data->class.init_state == INITIALIZED) /* common.ref_count _may_ be 0 */
     class = node->data->class.class;
   else
     class = NULL;


More information about the pkg-gnome-maintainers mailing list