gvariant-core: Use gatomicrefcount for GVariant reference count

This commit is contained in:
Tomasz Miąsko 2018-11-02 00:00:00 +00:00
parent a3ad5a2ce0
commit 6d108587a4

View File

@ -28,6 +28,7 @@
#include <glib/gbytes.h>
#include <glib/gslice.h>
#include <glib/gmem.h>
#include <glib/grefcount.h>
#include <string.h>
@ -74,7 +75,7 @@ struct _GVariant
} contents;
gint state;
gint ref_count;
gatomicrefcount ref_count;
gsize depth;
};
@ -488,7 +489,7 @@ g_variant_alloc (const GVariantType *type,
(trusted ? STATE_TRUSTED : 0) |
STATE_FLOATING;
value->size = (gssize) -1;
value->ref_count = 1;
g_atomic_ref_count_init (&value->ref_count);
value->depth = 0;
return value;
@ -632,9 +633,8 @@ void
g_variant_unref (GVariant *value)
{
g_return_if_fail (value != NULL);
g_return_if_fail (value->ref_count > 0);
if (g_atomic_int_dec_and_test (&value->ref_count))
if (g_atomic_ref_count_dec (&value->ref_count))
{
if G_UNLIKELY (value->state & STATE_LOCKED)
g_critical ("attempting to free a locked GVariant instance. "
@ -668,9 +668,8 @@ GVariant *
g_variant_ref (GVariant *value)
{
g_return_val_if_fail (value != NULL, NULL);
g_return_val_if_fail (value->ref_count > 0, NULL);
g_atomic_int_inc (&value->ref_count);
g_atomic_ref_count_inc (&value->ref_count);
return value;
}
@ -710,7 +709,7 @@ GVariant *
g_variant_ref_sink (GVariant *value)
{
g_return_val_if_fail (value != NULL, NULL);
g_return_val_if_fail (value->ref_count > 0, NULL);
g_return_val_if_fail (!g_atomic_ref_count_compare (&value->ref_count, 0), NULL);
g_variant_lock (value);
@ -767,7 +766,7 @@ GVariant *
g_variant_take_ref (GVariant *value)
{
g_return_val_if_fail (value != NULL, NULL);
g_return_val_if_fail (value->ref_count > 0, NULL);
g_return_val_if_fail (!g_atomic_ref_count_compare (&value->ref_count, 0), NULL);
g_atomic_int_and (&value->state, ~STATE_FLOATING);
@ -1043,7 +1042,7 @@ g_variant_get_child_value (GVariant *value,
child->state = (value->state & STATE_TRUSTED) |
STATE_SERIALISED;
child->size = s_child.size;
child->ref_count = 1;
g_atomic_ref_count_init (&child->ref_count);
child->depth = value->depth + 1;
child->contents.serialised.bytes =
g_bytes_ref (value->contents.serialised.bytes);