diff options
author | Thomas Haller <thaller@redhat.com> | 2021-04-14 21:11:42 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2021-04-16 11:44:18 +0200 |
commit | b01cbff0879cb398c3527073a0b6d730f7d7339a (patch) | |
tree | f8dc2b1f59d5a122ebfb1230ec192675cf89b39a | |
parent | ce9211500eae769ad255d6d8309f24964e85c0f6 (diff) | |
download | NetworkManager-b01cbff0879cb398c3527073a0b6d730f7d7339a.tar.gz |
glib-aux: add nm_g_variant_singleton_a*() helpers
-rw-r--r-- | src/libnm-glib-aux/nm-shared-utils.c | 48 | ||||
-rw-r--r-- | src/libnm-glib-aux/nm-shared-utils.h | 3 |
2 files changed, 51 insertions, 0 deletions
diff --git a/src/libnm-glib-aux/nm-shared-utils.c b/src/libnm-glib-aux/nm-shared-utils.c index 627135447c..41c1a40887 100644 --- a/src/libnm-glib-aux/nm-shared-utils.c +++ b/src/libnm-glib-aux/nm-shared-utils.c @@ -556,6 +556,54 @@ nm_g_variant_singleton_u_0(void) return _variant_singleton_get(g_variant_new_uint32(0)); } +static GVariant * +_variant_singleton_get_array_init(GVariant **p_singleton, const char *variant_type) +{ + GVariant *v; + + v = g_variant_new_array(G_VARIANT_TYPE(variant_type), NULL, 0); + g_variant_ref_sink(v); + + if (G_LIKELY(g_atomic_pointer_compare_and_exchange(p_singleton, NULL, v))) + return v; + + g_variant_unref(v); + + return g_atomic_pointer_get(p_singleton); +} + +#define _variant_singleton_get_array(variant_type) \ + ({ \ + static GVariant *_singleton = NULL; \ + GVariant * _v; \ + \ + _v = g_atomic_pointer_get(&_singleton); \ + if (G_UNLIKELY(!_v)) { \ + _v = _variant_singleton_get_array_init(&_singleton, "" variant_type ""); \ + nm_assert(_v); \ + } \ + nm_assert(g_variant_is_of_type(_v, G_VARIANT_TYPE("a" variant_type ""))); \ + _v; \ + }) + +GVariant * +nm_g_variant_singleton_aLsvI(void) +{ + return _variant_singleton_get_array("{sv}"); +} + +GVariant * +nm_g_variant_singleton_aLsaLsvII(void) +{ + return _variant_singleton_get_array("{sa{sv}}"); +} + +GVariant * +nm_g_variant_singleton_aaLsvI(void) +{ + return _variant_singleton_get_array("a{sv}"); +} + /*****************************************************************************/ GHashTable * diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index 9ea6973d94..05395e9cc4 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -1442,6 +1442,9 @@ 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_u_0(void); +GVariant *nm_g_variant_singleton_aLsvI(void); +GVariant *nm_g_variant_singleton_aLsaLsvII(void); +GVariant *nm_g_variant_singleton_aaLsvI(void); static inline void nm_g_variant_unref_floating(GVariant *var) |