summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-06-17 22:10:43 +0200
committerThomas Haller <thaller@redhat.com>2021-06-23 12:13:27 +0200
commitedb31252cc4d57e8d80b1e1c907b3c37a49a250b (patch)
tree243a2837046804677866d578f06c4d2fe87f2083
parent48d345d62f8c23997d455026ba3afd4e7130368e (diff)
glib-aux: add nm_g_variant_singleton_b() helper
-rw-r--r--src/libnm-glib-aux/nm-shared-utils.c45
-rw-r--r--src/libnm-glib-aux/nm-shared-utils.h1
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);