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