From 00509d2d6ac210ee0c2a296682f2f7c85d92e6ae Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 4 May 2022 17:23:56 +0200 Subject: [PATCH] glibcompat: Provide proper override for 'g_hash_table_steal_extended' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We've emulated the function in virHashSteal, with a note pointing to use the proper version. Move the code to glibcomapt.c and make it such that builds using newer glib already use the new function. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/util/glibcompat.c | 20 ++++++++++++++++++++ src/util/glibcompat.h | 8 ++++++++ src/util/virhash.c | 11 +++-------- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/util/glibcompat.c b/src/util/glibcompat.c index eb6dcc0111..fdc32af5e2 100644 --- a/src/util/glibcompat.c +++ b/src/util/glibcompat.c @@ -64,6 +64,7 @@ #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #undef g_canonicalize_filename +#undef g_hash_table_steal_extended #undef g_fsync #undef g_strdup_printf #undef g_strdup_vprintf @@ -173,6 +174,25 @@ vir_g_canonicalize_filename(const gchar *filename, } +gboolean +vir_g_hash_table_steal_extended(GHashTable *hash_table, + gconstpointer lookup_key, + gpointer *stolen_key, + gpointer *stolen_value) +{ +#if GLIB_CHECK_VERSION(2, 58, 0) + return g_hash_table_steal_extended(hash_table, lookup_key, stolen_key, stolen_value); +#else /* ! GLIB_CHECK_VERSION(2, 58, 0) */ + if (!(g_hash_table_lookup_extended(hash_table, lookup_key, stolen_key, stolen_value))) + return FALSE; + + g_hash_table_steal(hash_table, lookup_key); + + return TRUE; +#endif /* ! GLIB_CHECK_VERSION(2, 58, 0) */ +} + + /* Drop when min glib >= 2.63.0 */ gint vir_g_fsync(gint fd) diff --git a/src/util/glibcompat.h b/src/util/glibcompat.h index 697687b967..1f3a6f728f 100644 --- a/src/util/glibcompat.h +++ b/src/util/glibcompat.h @@ -70,6 +70,14 @@ gchar * vir_g_canonicalize_filename(const gchar *filename, const gchar *relative_to); + +gboolean +vir_g_hash_table_steal_extended(GHashTable *hash_table, + gconstpointer lookup_key, + gpointer *stolen_key, + gpointer *stolen_value); +#define g_hash_table_steal_extended vir_g_hash_table_steal_extended + gint vir_g_fsync(gint fd); char *vir_g_strdup_printf(const char *msg, ...) G_GNUC_PRINTF(1, 2); diff --git a/src/util/virhash.c b/src/util/virhash.c index a89b2d662e..c72c248186 100644 --- a/src/util/virhash.c +++ b/src/util/virhash.c @@ -242,24 +242,19 @@ virHashHasEntry(GHashTable *table, * Find the userdata specified by @name * and remove it from the hash without freeing it. * - * Deprecated: consider using g_hash_table_steal_extended once we upgrade to - * glib 2.58 + * Deprecated: consider using g_hash_table_steal_extended instead * * Returns a pointer to the userdata */ void *virHashSteal(GHashTable *table, const char *name) { - g_autofree void *orig_name = NULL; + g_autofree void *orig_name = NULL; /* the original key needs to be freed */ void *val = NULL; if (!table || !name) return NULL; - /* we can replace this by g_hash_table_steal_extended with glib 2.58 */ - if (!(g_hash_table_lookup_extended(table, name, &orig_name, &val))) - return NULL; - - g_hash_table_steal(table, name); + g_hash_table_steal_extended(table, name, &orig_name, &val); return val; }