mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-27 06:26:15 +01:00
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:
parent
5e7dba0501
commit
4c243b1cba
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user