Make type_data_unref_U not take locks in the common case

https://bugzilla.gnome.org/show_bug.cgi?id=585375
This commit is contained in:
Edward Hervey 2009-09-24 11:45:13 +02:00 committed by Alexander Larsson
parent 5e7dba0501
commit 4c243b1cba

View File

@ -2346,11 +2346,12 @@ static inline void
type_data_unref_U (TypeNode *node, type_data_unref_U (TypeNode *node,
gboolean uncached) gboolean uncached)
{ {
G_WRITE_LOCK (&type_rw_lock); guint current;
g_assert (node->data && NODE_REFCOUNT (node) > 0);
if (NODE_REFCOUNT (node) > 1) do {
g_atomic_int_add ((int *) &node->ref_count, -1); current = NODE_REFCOUNT (node);
else
if (current <= 1)
{ {
if (!node->plugin) if (!node->plugin)
{ {
@ -2358,13 +2359,17 @@ type_data_unref_U (TypeNode *node,
NODE_NAME (node)); NODE_NAME (node));
return; return;
} }
G_WRITE_UNLOCK (&type_rw_lock);
g_assert (current > 0);
g_static_rec_mutex_lock (&class_init_rec_mutex); /* required locking order: 1) class_init_rec_mutex, 2) type_rw_lock */ g_static_rec_mutex_lock (&class_init_rec_mutex); /* required locking order: 1) class_init_rec_mutex, 2) type_rw_lock */
G_WRITE_LOCK (&type_rw_lock); G_WRITE_LOCK (&type_rw_lock);
type_data_last_unref_Wm (node, uncached); type_data_last_unref_Wm (node, uncached);
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;
} }
G_WRITE_UNLOCK (&type_rw_lock); } while (!g_atomic_int_compare_and_exchange ((int *) &node->ref_count, current, current - 1));
} }
/** /**