From edb31252cc4d57e8d80b1e1c907b3c37a49a250b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 17 Jun 2021 22:10:43 +0200 Subject: glib-aux: add nm_g_variant_singleton_b() helper --- src/libnm-glib-aux/nm-shared-utils.c | 45 +++++++++++++++++++++--------------- src/libnm-glib-aux/nm-shared-utils.h | 1 + 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/libnm-glib-aux/nm-shared-utils.c b/src/libnm-glib-aux/nm-shared-utils.c index 936d900618..e2d88af66a 100644 --- a/src/libnm-glib-aux/nm-shared-utils.c +++ b/src/libnm-glib-aux/nm-shared-utils.c @@ -529,24 +529,26 @@ nm_utils_gbytes_to_variant_ay(GBytes *bytes) /*****************************************************************************/ -#define _variant_singleton_get(create_variant) \ - ({ \ - static GVariant *_singleton = NULL; \ - GVariant * _v; \ - \ -again: \ - _v = g_atomic_pointer_get(&_singleton); \ - if (G_UNLIKELY(!_v)) { \ - _v = (create_variant); \ - nm_assert(_v); \ - nm_assert(g_variant_is_floating(_v)); \ - g_variant_ref_sink(_v); \ - if (!g_atomic_pointer_compare_and_exchange(&_singleton, NULL, _v)) { \ - g_variant_unref(_v); \ - goto again; \ - } \ - } \ - _v; \ +#define _variant_singleton_get(create_variant) \ + ({ \ + static GVariant *_singleton = NULL; \ + GVariant * _v; \ + \ + while (TRUE) { \ + _v = g_atomic_pointer_get(&_singleton); \ + if (G_UNLIKELY(!_v)) { \ + _v = (create_variant); \ + nm_assert(_v); \ + nm_assert(g_variant_is_floating(_v)); \ + g_variant_ref_sink(_v); \ + if (!g_atomic_pointer_compare_and_exchange(&_singleton, NULL, _v)) { \ + g_variant_unref(_v); \ + continue; \ + } \ + } \ + break; \ + } \ + _v; \ }) GVariant * @@ -555,6 +557,13 @@ nm_g_variant_singleton_u_0(void) return _variant_singleton_get(g_variant_new_uint32(0)); } +GVariant * +nm_g_variant_singleton_b(gboolean value) +{ + return value ? _variant_singleton_get(g_variant_new_boolean(TRUE)) + : _variant_singleton_get(g_variant_new_boolean(FALSE)); +} + static GVariant * _variant_singleton_get_array_init(GVariant **p_singleton, const char *variant_type) { diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index 62fd064265..129963f20b 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -1503,6 +1503,7 @@ char *nm_utils_str_utf8safe_unescape_cp(const char *str, NMUtilsStrUtf8SafeFlags char *nm_utils_str_utf8safe_escape_take(char *str, NMUtilsStrUtf8SafeFlags flags); +GVariant *nm_g_variant_singleton_b(gboolean value); GVariant *nm_g_variant_singleton_u_0(void); GVariant *nm_g_variant_singleton_aLsvI(void); GVariant *nm_g_variant_singleton_aLsaLsvII(void); -- cgit v1.2.3