glib-aux: add nm_g_variant_singleton_b() helper

(cherry picked from commit edb31252cc)
This commit is contained in:
Thomas Haller 2021-06-17 22:10:43 +02:00
parent aa1be0559d
commit b33ba1ef5c
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
2 changed files with 28 additions and 18 deletions

View file

@ -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)
{

View file

@ -1487,6 +1487,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);