mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-05 07:38:20 +02:00
glib-aux: add nm_g_variant_singleton_b() helper
(cherry picked from commit edb31252cc)
This commit is contained in:
parent
aa1be0559d
commit
b33ba1ef5c
2 changed files with 28 additions and 18 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue