gvarianttypeinfo: Use gatomicrefcount for ContainerInfo reference count

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

View File

@ -26,6 +26,7 @@
#include <glib/gthread.h> #include <glib/gthread.h>
#include <glib/gslice.h> #include <glib/gslice.h>
#include <glib/ghash.h> #include <glib/ghash.h>
#include <glib/grefcount.h>
/* < private > /* < private >
* GVariantTypeInfo: * GVariantTypeInfo:
@ -76,7 +77,7 @@ typedef struct
GVariantTypeInfo info; GVariantTypeInfo info;
gchar *type_string; gchar *type_string;
gint ref_count; gatomicrefcount ref_count;
} ContainerInfo; } ContainerInfo;
/* For 'array' and 'maybe' types, we store some extra information on the /* For 'array' and 'maybe' types, we store some extra information on the
@ -167,7 +168,7 @@ g_variant_type_info_check (const GVariantTypeInfo *info,
ContainerInfo *container = (ContainerInfo *) info; ContainerInfo *container = (ContainerInfo *) info;
/* extra checks for containers */ /* extra checks for containers */
g_assert_cmpint (g_atomic_int_get (&container->ref_count), >, 0); g_assert (!g_atomic_ref_count_compare (&container->ref_count, 0));
g_assert (container->type_string != NULL); g_assert (container->type_string != NULL);
} }
else else
@ -788,7 +789,7 @@ g_variant_type_info_get (const GVariantType *type)
info = (GVariantTypeInfo *) container; info = (GVariantTypeInfo *) container;
container->type_string = type_string; container->type_string = type_string;
container->ref_count = 1; g_atomic_ref_count_init (&container->ref_count);
g_hash_table_insert (g_variant_type_info_table, type_string, info); g_hash_table_insert (g_variant_type_info_table, type_string, info);
type_string = NULL; type_string = NULL;
@ -834,8 +835,7 @@ g_variant_type_info_ref (GVariantTypeInfo *info)
{ {
ContainerInfo *container = (ContainerInfo *) info; ContainerInfo *container = (ContainerInfo *) info;
g_assert_cmpint (g_atomic_int_get (&container->ref_count), >, 0); g_atomic_ref_count_inc (&container->ref_count);
g_atomic_int_inc (&container->ref_count);
} }
return info; return info;
@ -858,7 +858,7 @@ g_variant_type_info_unref (GVariantTypeInfo *info)
ContainerInfo *container = (ContainerInfo *) info; ContainerInfo *container = (ContainerInfo *) info;
g_rec_mutex_lock (&g_variant_type_info_lock); g_rec_mutex_lock (&g_variant_type_info_lock);
if (g_atomic_int_dec_and_test (&container->ref_count)) if (g_atomic_ref_count_dec (&container->ref_count))
{ {
g_hash_table_remove (g_variant_type_info_table, g_hash_table_remove (g_variant_type_info_table,
container->type_string); container->type_string);