From b6f3522c851a98cb9c69ab14f4ba984624554d60 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 11 Jun 2020 13:11:52 -0700 Subject: [PATCH] Iterate user table in a sorted way, fix tests with latest glib This is primarily to help test cases which assume that the adopted algorithm prioritizes the users in the exact order they appear in the test cases (and get inserted into the session in that order). With older glib version, the five users being inserted into the user table hash table by the tests happened to retain the order. With latest glib, due to a minor tweak in hashing strategy, the order of iteration is different from the order of insertion failing the tests. In addition, GHashTable makes no guarantees about the stability of items when iterating multiple times. Since the algorithm is sensitive to order of users, it is best to return users in an order that is consistent over multiple calls and stable over insert/remove operations. This patch sorts the keys during iteration of users in the user table. Closes: #22. Signed-off-by: Sunil Mohan Adapa --- libinfinity/common/inf-user-table.c | 31 +++++++++++++++++------------ 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/libinfinity/common/inf-user-table.c b/libinfinity/common/inf-user-table.c index 11b06b4..e376613 100644 --- a/libinfinity/common/inf-user-table.c +++ b/libinfinity/common/inf-user-table.c @@ -179,15 +179,11 @@ inf_user_table_lookup_user_by_name_func(gpointer key, return FALSE; } -static void -inf_user_table_foreach_user_func(gpointer key, - gpointer value, - gpointer user_data) +static gint +inf_user_id_list_sort_compare_func(gconstpointer a, + gconstpointer b) { - InfUserTableForeachUserData* data; - data = (InfUserTableForeachUserData*)user_data; - - data->func(INF_USER(value), data->user_data); + return GPOINTER_TO_UINT(a) - GPOINTER_TO_UINT(b); } static void @@ -647,6 +643,11 @@ inf_user_table_foreach_user(InfUserTable* user_table, { InfUserTablePrivate* priv; InfUserTableForeachUserData data; + GList* user_id_list; + GList* item; + InfUser* user; + + guint user_id; g_return_if_fail(INF_IS_USER_TABLE(user_table)); g_return_if_fail(func != NULL); @@ -656,11 +657,15 @@ inf_user_table_foreach_user(InfUserTable* user_table, data.func = func; data.user_data = user_data; - g_hash_table_foreach( - priv->table, - inf_user_table_foreach_user_func, - &data - ); + user_id_list = g_hash_table_get_keys(priv->table); + user_id_list = g_list_sort(user_id_list, inf_user_id_list_sort_compare_func); + for(item = user_id_list; item != NULL; item = g_list_next(item)) + { + user_id = GPOINTER_TO_UINT(item->data); + user = inf_user_table_lookup_user_by_id(user_table, user_id); + func(user, user_data); + } + g_list_free(user_id_list); } /**