From: Daniel Wagner <[email protected]>

Maintaining an additional hash map for network - service mapping.
connman_network_get_ident() and connman_network_get_group() will only
return a correct value when a device is assigned to the network.
---
 src/service.c |   42 +++++++++++-------------------------------
 1 file changed, 11 insertions(+), 31 deletions(-)

diff --git a/src/service.c b/src/service.c
index ba35dc9..36140f9 100644
--- a/src/service.c
+++ b/src/service.c
@@ -39,6 +39,7 @@ static DBusConnection *connection = NULL;
 
 static GSequence *service_list = NULL;
 static GHashTable *service_hash = NULL;
+static GHashTable *network_hash = NULL;
 static GSList *counter_list = NULL;
 
 struct connman_stats {
@@ -3493,6 +3494,7 @@ static void service_free(gpointer user_data)
 
        if (service->network != NULL) {
                __connman_network_disconnect(service->network);
+               g_hash_table_remove(network_hash, service->network);
                connman_network_unref(service->network);
                service->network = NULL;
        }
@@ -4836,23 +4838,6 @@ int __connman_service_disconnect_all(void)
 
 }
 
-/**
- * lookup_by_identifier:
- * @identifier: service identifier
- *
- * Look up a service by identifier (reference count will not be increased)
- */
-static struct connman_service *lookup_by_identifier(const char *identifier)
-{
-       GSequenceIter *iter;
-
-       iter = g_hash_table_lookup(service_hash, identifier);
-       if (iter != NULL)
-               return g_sequence_get(iter);
-
-       return NULL;
-}
-
 static void provision_changed(gpointer value, gpointer user_data)
 {
        struct connman_service *service = value;
@@ -5131,26 +5116,13 @@ void __connman_service_create_ip6config(struct 
connman_service *service,
 struct connman_service *__connman_service_lookup_from_network(struct 
connman_network *network)
 {
        struct connman_service *service;
-       const char *ident, *group;
-       char *name;
 
        DBG("network %p", network);
 
        if (network == NULL)
                return NULL;
 
-       ident = __connman_network_get_ident(network);
-       if (ident == NULL)
-               return NULL;
-
-       group = connman_network_get_group(network);
-       if (group == NULL)
-               return NULL;
-
-       name = g_strdup_printf("%s_%s_%s",
-                       __connman_network_get_type(network), ident, group);
-       service = lookup_by_identifier(name);
-       g_free(name);
+       service = g_hash_table_lookup(network_hash, network);
 
        return service;
 }
@@ -5312,6 +5284,8 @@ static void update_from_network(struct connman_service 
*service,
        if (service->network == NULL)
                service->network = connman_network_ref(network);
 
+       g_hash_table_replace(network_hash, service->network, service);
+
        iter = g_hash_table_lookup(service_hash, service->identifier);
        if (iter != NULL)
                g_sequence_sort_changed(iter, service_compare, NULL);
@@ -5562,6 +5536,9 @@ int __connman_service_init(void)
 
        service_list = g_sequence_new(service_free);
 
+       network_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+                                               NULL, NULL);
+
        services_notify = g_new0(struct _services_notify, 1);
        services_notify->remove = g_hash_table_new_full(g_str_hash,
                        g_str_equal, g_free, NULL);
@@ -5586,6 +5563,9 @@ void __connman_service_cleanup(void)
        g_slist_free(counter_list);
        counter_list = NULL;
 
+       g_hash_table_destroy(network_hash);
+       network_hash = NULL;
+
        if (services_notify->id != 0) {
                g_source_remove(services_notify->id);
                service_send_signals(NULL);
-- 
1.7.10.rc3.1.gb3065

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to