From 8d8325b7b833a134024e6e20588944f5a0850040 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 4 Apr 2009 12:22:46 +0200 Subject: [PATCH] Use sequence instead of hash table for service list --- src/profile.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/profile.c b/src/profile.c index 3cf1e1e..2343d21 100644 --- a/src/profile.c +++ b/src/profile.c @@ -36,6 +36,8 @@ enum connman_service_state { }; struct connman_group { + GSequenceIter *iter; + char *id; char *path; char *type; char *name; @@ -47,7 +49,7 @@ struct connman_group { struct connman_network *network; }; -static GHashTable *groups = NULL; +static GSequence *groups = NULL; static DBusConnection *connection = NULL; @@ -176,11 +178,20 @@ static void free_group(gpointer data) g_free(group->name); g_free(group->type); g_free(group->path); + g_free(group->id); g_free(group); } +static gint compare_group(gconstpointer a, gconstpointer b, gpointer user_data) +{ + struct connman_group *group = (void *) a; + + return g_strcmp0(group->id, user_data); +} + static struct connman_group *lookup_group(const char *name) { + GSequenceIter *iter; struct connman_group *group; DBG("name %s", name); @@ -188,14 +199,20 @@ static struct connman_group *lookup_group(const char *name) if (name == NULL) return NULL; - group = g_hash_table_lookup(groups, name); - if (group != NULL) - goto done; + iter = g_sequence_search(groups, NULL, compare_group, (char *) name); + if (g_sequence_iter_is_begin(iter) == FALSE && + g_sequence_iter_is_end(iter) == FALSE) { + group = g_sequence_get(iter); + if (group != NULL) + goto done; + } group = g_try_new0(struct connman_group, 1); if (group == NULL) return NULL; + group->id = g_strdup(name); + group->type = CONNMAN_ELEMENT_TYPE_UNKNOWN; group->path = g_strdup_printf("%s/%s", PROFILE_DEFAULT, name); @@ -203,7 +220,7 @@ static struct connman_group *lookup_group(const char *name) group->state = CONNMAN_SERVICE_STATE_IDLE; - g_hash_table_insert(groups, g_strdup(name), group); + group->iter = g_sequence_append(groups, group); g_dbus_register_interface(connection, group->path, CONNMAN_SERVICE_INTERFACE, @@ -323,7 +340,7 @@ void __connman_profile_list(DBusMessageIter *iter) dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path); } -static void append_path(gpointer key, gpointer value, gpointer user_data) +static void append_path(gpointer value, gpointer user_data) { struct connman_group *group = value; DBusMessageIter *iter = user_data; @@ -336,7 +353,7 @@ void __connman_profile_list_services(DBusMessageIter *iter) { DBG(""); - g_hash_table_foreach(groups, append_path, iter); + g_sequence_foreach(groups, append_path, iter); } static void append_services(DBusMessageIter *dict) @@ -406,8 +423,7 @@ int __connman_profile_init(DBusConnection *conn) if (connection == NULL) return -1; - groups = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, free_group); + groups = g_sequence_new(free_group); g_dbus_register_interface(connection, PROFILE_DEFAULT, CONNMAN_PROFILE_INTERFACE, @@ -424,7 +440,7 @@ void __connman_profile_cleanup(void) g_dbus_unregister_interface(connection, PROFILE_DEFAULT, CONNMAN_PROFILE_INTERFACE); - g_hash_table_destroy(groups); + g_sequence_free(groups); groups = NULL; if (connection == NULL) -- 2.7.4