summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-04-14 21:11:42 +0200
committerThomas Haller <thaller@redhat.com>2021-04-16 11:44:18 +0200
commitb01cbff0879cb398c3527073a0b6d730f7d7339a (patch)
treef8dc2b1f59d5a122ebfb1230ec192675cf89b39a
parentce9211500eae769ad255d6d8309f24964e85c0f6 (diff)
downloadNetworkManager-b01cbff0879cb398c3527073a0b6d730f7d7339a.tar.gz
glib-aux: add nm_g_variant_singleton_a*() helpers
-rw-r--r--src/libnm-glib-aux/nm-shared-utils.c48
-rw-r--r--src/libnm-glib-aux/nm-shared-utils.h3
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)