From: Daniel Wagner <[email protected]>

The struct service_entry contains now only the pointer a service.
There is no need to keep this pointer in a separate data structure
instead we are allowed to use pointers directly (via session->service
and session->service_last).
---
 src/session.c | 195 ++++++++++++++++++++--------------------------------------
 1 file changed, 66 insertions(+), 129 deletions(-)

diff --git a/src/session.c b/src/session.c
index 9e45e40..992fb9a 100644
--- a/src/session.c
+++ b/src/session.c
@@ -34,7 +34,6 @@
 
 static DBusConnection *connection;
 static GHashTable *session_hash;
-static GHashTable *entry_hash;
 static struct connman_session *ecall_session;
 static GSList *policy_list;
 static uint32_t session_mark = 256;
@@ -61,10 +60,6 @@ enum connman_session_state {
        CONNMAN_SESSION_STATE_ONLINE         = 2,
 };
 
-struct service_entry {
-       struct connman_service *service;
-};
-
 struct session_info {
        struct connman_session_config config;
        enum connman_session_state state;
@@ -82,8 +77,8 @@ struct connman_session {
        bool append_all;
        struct session_info *info;
        struct session_info *info_last;
-       struct service_entry *entry;
-       struct service_entry *entry_last;
+       struct connman_service *service;
+       struct connman_service *service_last;
        struct connman_session_config *policy_config;
        GSList *user_allowed_bearers;
 
@@ -395,10 +390,10 @@ static void add_default_route(struct connman_session 
*session)
        struct connman_ipconfig *ipconfig;
        int err;
 
-       if (!session->entry)
+       if (!session->service)
                return;
 
-       ipconfig = __connman_service_get_ip4config(session->entry->service);
+       ipconfig = __connman_service_get_ip4config(session->service);
        session->index = __connman_ipconfig_get_index(ipconfig);
        session->gateway = g_strdup(__connman_ipconfig_get_gateway(ipconfig));
 
@@ -867,12 +862,12 @@ static void append_notify(DBusMessageIter *dict,
                info_last->state = info->state;
        }
 
-       if (session->append_all ||
-                       session->entry != session->entry_last) {
-               if (session->entry) {
-                       service = session->entry->service;
+       if (session->append_all || session->service != session->service_last) {
+               if (session->service) {
+                       service = session->service;
                        name = __connman_service_get_name(service);
                        idx = __connman_service_get_index(service);
+
                        ifname = connman_inet_ifname(idx);
                        if (!ifname)
                                ifname = g_strdup("");
@@ -908,7 +903,7 @@ static void append_notify(DBusMessageIter *dict,
 
                g_free(ifname);
 
-               session->entry_last = session->entry;
+               session->service_last = session->service;
        }
 
        if (session->append_all ||
@@ -968,7 +963,7 @@ static bool compute_notifiable_changes(struct 
connman_session *session)
        if (info->state != info_last->state)
                return true;
 
-       if (session->entry != session->entry_last &&
+       if (session->service != session->service_last &&
                        info->state >= CONNMAN_SESSION_STATE_CONNECTED)
                return true;
 
@@ -1013,14 +1008,14 @@ static void ipconfig_ipv4_changed(struct 
connman_session *session)
 {
        connman_dbus_setting_changed_dict(session->owner, session->notify_path,
                                                "IPv4", append_ipconfig_ipv4,
-                                               session->entry->service);
+                                               session->service);
 }
 
 static void ipconfig_ipv6_changed(struct connman_session *session)
 {
        connman_dbus_setting_changed_dict(session->owner, session->notify_path,
                                                "IPv6", append_ipconfig_ipv6,
-                                               session->entry->service);
+                                               session->service);
 }
 
 static bool service_type_match(struct connman_session *session,
@@ -1133,12 +1128,11 @@ static gint sort_allowed_bearers(struct connman_service 
*service_a,
 
 static gint sort_services(gconstpointer a, gconstpointer b, gpointer user_data)
 {
-       struct service_entry *entry_a = (void *)a;
-       struct service_entry *entry_b = (void *)b;
+       struct connman_service *service_a = (void *)a;
+       struct connman_service *service_b = (void *)b;
        struct connman_session *session = user_data;
 
-       return sort_allowed_bearers(entry_a->service, entry_b->service,
-                               session);
+       return sort_allowed_bearers(service_a, service_b, session);
 }
 
 static enum connman_session_state service_to_session_state(enum 
connman_service_state state)
@@ -1230,33 +1224,33 @@ static void deselect_and_disconnect(struct 
connman_session *session)
 
        info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
 
-       if (!session->entry)
+       if (!session->service)
                return;
 
-       session->entry = NULL;
+       session->service = NULL;
 
        update_routing_table(session);
 }
 
 static void select_connected_service(struct connman_session *session,
-                                       struct service_entry *entry)
+                                       struct connman_service *service)
 {
        struct session_info *info = session->info;
        enum connman_service_state service_state;
        enum connman_session_state state;
 
-       service_state = __connman_service_get_state(entry->service);
+       service_state = __connman_service_get_state(service);
        state = service_to_session_state(service_state);
        if (!is_type_matching_state(&state, info->config.type))
                return;
 
        info->state = state;
 
-       session->entry = entry;
+       session->service = service;
 }
 
 static void select_offline_service(struct connman_session *session,
-                                       struct service_entry *entry)
+                                       struct connman_service *service)
 {
        struct session_info *info = session->info;
        enum connman_service_state service_state;
@@ -1264,31 +1258,31 @@ static void select_offline_service(struct 
connman_session *session,
        if (!explicit_connect(info->reason))
                return;
 
-       service_state = __connman_service_get_state(entry->service);
+       service_state = __connman_service_get_state(service);
        info->state = service_to_session_state(service_state);
 
-       session->entry = entry;
+       session->service = service;
 }
 
 static void select_service(struct connman_session *session,
-                               struct service_entry *entry)
+                               struct connman_service *service)
 {
        enum connman_service_state service_state;
 
-       DBG("service %p", entry->service);
+       DBG("service %p", service);
 
-       service_state = __connman_service_get_state(entry->service);
+       service_state = __connman_service_get_state(service);
        if (is_connected(service_state))
-               select_connected_service(session, entry);
+               select_connected_service(session, service);
        else
-               select_offline_service(session, entry);
+               select_offline_service(session, service);
 }
 
 static void select_and_connect(struct connman_session *session,
                                enum connman_session_reason reason)
 {
        struct session_info *info = session->info;
-       struct service_entry *entry = NULL;
+       struct connman_service *service = NULL;
        enum connman_service_state service_state;
        GList *list;
 
@@ -1305,9 +1299,9 @@ static void select_and_connect(struct connman_session 
*session,
        info->reason = reason;
 
        for (list = session->service_list; list; list = list->next) {
-               entry = list->data;
+               service = list->data;
 
-               service_state = __connman_service_get_state(entry->service);
+               service_state = __connman_service_get_state(service);
                switch (service_state) {
                case CONNMAN_SERVICE_STATE_ASSOCIATION:
                case CONNMAN_SERVICE_STATE_CONFIGURATION:
@@ -1315,7 +1309,7 @@ static void select_and_connect(struct connman_session 
*session,
                case CONNMAN_SERVICE_STATE_ONLINE:
                case CONNMAN_SERVICE_STATE_IDLE:
                case CONNMAN_SERVICE_STATE_DISCONNECT:
-                       select_service(session, entry);
+                       select_service(session, service);
                        update_routing_table(session);
                        return;
                case CONNMAN_SERVICE_STATE_UNKNOWN:
@@ -1325,29 +1319,11 @@ static void select_and_connect(struct connman_session 
*session,
        }
 }
 
-static struct service_entry *create_service_entry(
-                                       struct connman_session * session,
-                                       struct connman_service *service)
-{
-       struct service_entry *entry;
-
-       entry = g_try_new0(struct service_entry, 1);
-       if (!entry)
-               return entry;
-
-       entry->service = service;
-
-       g_hash_table_replace(entry_hash, entry, session);
-
-       return entry;
-}
-
 static void iterate_service_cb(struct connman_service *service,
                                void *user_data)
 {
        struct connman_session *session = user_data;
        enum connman_service_state service_state;
-       struct service_entry *entry;
 
        service_state = __connman_service_get_state(service);
        if (!is_connected(service_state))
@@ -1356,26 +1332,7 @@ static void iterate_service_cb(struct connman_service 
*service,
        if (!service_match(session, service))
                return;
 
-       entry = create_service_entry(session, service);
-       if (!entry)
-               return;
-
-       g_hash_table_replace(session->service_hash, service, entry);
-}
-
-static void destroy_service_entry(gpointer data)
-{
-       struct service_entry *entry = data;
-       struct connman_session *session;
-
-       session = g_hash_table_lookup(entry_hash, entry);
-
-       if (session->entry && session->entry == entry)
-               deselect_and_disconnect(session);
-
-       g_hash_table_remove(entry_hash, entry);
-
-       g_free(entry);
+       g_hash_table_replace(session->service_hash, service, NULL);
 }
 
 static void populate_service_list(struct connman_session *session)
@@ -1385,19 +1342,19 @@ static void populate_service_list(struct 
connman_session *session)
 
        session->service_hash =
                g_hash_table_new_full(g_direct_hash, g_direct_equal,
-                                       NULL, destroy_service_entry);
+                                       NULL, NULL);
        __connman_service_iterate_services(iterate_service_cb, session);
 
        g_hash_table_iter_init(&iter, session->service_hash);
 
        while (g_hash_table_iter_next(&iter, &key, &value)) {
-               struct service_entry *entry = value;
+               struct connman_service *service = key;
 
-               DBG("service %p type %s name %s", entry->service,
-                       
service2bearer(connman_service_get_type(entry->service)),
-                       __connman_service_get_name(entry->service));
+               DBG("service %p type %s name %s", service,
+                       service2bearer(connman_service_get_type(service)),
+                       __connman_service_get_name(service));
                session->service_list = g_list_prepend(session->service_list,
-                                                       entry);
+                                                       service);
        }
 
        session->service_list = g_list_sort_with_data(session->service_list,
@@ -1409,8 +1366,7 @@ static void session_changed(struct connman_session 
*session,
 {
        struct session_info *info = session->info;
        struct session_info *info_last = session->info_last;
-       struct connman_service *service;
-       struct service_entry *entry = NULL, *entry_last = NULL;
+       struct connman_service *service = NULL, *service_last = NULL;
        enum connman_service_state service_state;
        GHashTable *service_hash_last;
 
@@ -1422,11 +1378,11 @@ static void session_changed(struct connman_session 
*session,
        DBG("session %p trigger %s reason %s", session, trigger2string(trigger),
                                                reason2string(info->reason));
 
-       if (session->entry) {
+
+       if (session->service) {
                enum connman_session_state state;
 
-               service_state = __connman_service_get_state(
-                                       session->entry->service);
+               service_state = __connman_service_get_state(session->service);
                state = service_to_session_state(service_state);
 
                if (is_type_matching_state(&state, info->config.type))
@@ -1444,23 +1400,20 @@ static void session_changed(struct connman_session 
*session,
                        g_list_free(session->service_list);
                        session->service_list = NULL;
 
-                       if (session->entry)
-                               service = session->entry->service;
-                       else
-                               service = NULL;
+                       service = session->service;
 
                        populate_service_list(session);
 
-                       if (session->entry) {
-                               entry_last = g_hash_table_lookup(
+                       if (service) {
+                               service_last = g_hash_table_lookup(
                                                        service_hash_last,
-                                                       
session->entry->service);
-                               entry = g_hash_table_lookup(
-                                                       session->service_hash,
                                                        service);
                        }
 
-                       if (!entry && entry_last) {
+                       if (service_last &&
+                               !g_hash_table_lookup(session->service_hash,
+                                                       service)) {
+
                                /*
                                 * The currently selected service is
                                 * not part of this session anymore.
@@ -1493,9 +1446,9 @@ static void session_changed(struct connman_session 
*session,
                if (info->state >= CONNMAN_SESSION_STATE_CONNECTED)
                        break;
 
-               if (session->entry) {
+               if (session->service) {
                        service_state = __connman_service_get_state(
-                                               session->entry->service);
+                                               session->service);
                        if (is_connecting(service_state))
                                break;
                }
@@ -1508,12 +1461,12 @@ static void session_changed(struct connman_session 
*session,
 
                break;
        case CONNMAN_SESSION_TRIGGER_SERVICE:
-               if (session->entry) {
+               if (session->service) {
                        service_state = __connman_service_get_state(
-                                               session->entry->service);
+                                               session->service);
                        if (is_connecting(service_state) ||
-                                       is_connected(service_state))
-                               break;
+                               is_connected(service_state))
+                       break;
                }
 
                select_and_connect(session, info->reason);
@@ -2163,7 +2116,6 @@ static void service_add(struct connman_service *service, 
const char *name)
        GHashTableIter iter;
        gpointer key, value;
        struct connman_session *session;
-       struct service_entry *entry;
 
        DBG("service %p", service);
 
@@ -2175,25 +2127,18 @@ static void service_add(struct connman_service 
*service, const char *name)
                if (!service_match(session, service))
                        continue;
 
-               entry = g_hash_table_lookup(session->service_hash, service);
-               if (entry) {
+               if (g_hash_table_lookup(session->service_hash, service)) {
                        session->service_list =
                                g_list_sort_with_data(session->service_list,
                                                sort_services, session);
-
                } else {
-                       entry = create_service_entry(session, service);
-
-                       if (!entry)
-                               continue;
-
                        session->service_list =
                                g_list_insert_sorted_with_data(
-                               session->service_list, entry,
+                               session->service_list, service,
                                sort_services, session);
 
-                       g_hash_table_replace(session->service_hash, service,
-                                       entry);
+                       g_hash_table_replace(session->service_hash,
+                                               service, service);
                }
 
                session_changed(session, CONNMAN_SESSION_TRIGGER_SERVICE);
@@ -2204,27 +2149,24 @@ static void service_remove(struct connman_service 
*service)
 {
        GHashTableIter iter;
        gpointer key, value;
-       struct connman_session *session;
 
        DBG("service %p", service);
 
        g_hash_table_iter_init(&iter, session_hash);
 
        while (g_hash_table_iter_next(&iter, &key, &value)) {
-               struct service_entry *entry;
-               session = value;
+               struct connman_session *session = value;
 
-               entry = g_hash_table_lookup(session->service_hash, service);
-               if (!entry)
+               if (!g_hash_table_lookup(session->service_hash, service))
                        continue;
 
                session->service_list = g_list_remove(session->service_list,
-                                                       entry);
+                                                       service);
 
                g_hash_table_remove(session->service_hash, service);
 
-               if (session->entry && session->entry->service == service)
-                       session->entry = NULL;
+               if (session->service && session->service == service)
+                       session->service = NULL;
                session_changed(session, CONNMAN_SESSION_TRIGGER_SERVICE);
        }
 }
@@ -2262,7 +2204,7 @@ static void ipconfig_changed(struct connman_service 
*service,
                if (info->state == CONNMAN_SESSION_STATE_DISCONNECTED)
                        continue;
 
-               if (session->entry && session->entry->service == service) {
+               if (session->service && session->service == service) {
                        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
                                ipconfig_ipv4_changed(session);
                        else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
@@ -2311,9 +2253,6 @@ int __connman_session_init(void)
        session_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                NULL, cleanup_session);
 
-       entry_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal,
-                                               NULL, NULL);
-
        __connman_nfacct_flush(session_nfacct_flush_cb, NULL);
 
        return 0;
@@ -2332,9 +2271,7 @@ void __connman_session_cleanup(void)
 
        g_hash_table_foreach(session_hash, release_session, NULL);
        g_hash_table_destroy(session_hash);
-       g_hash_table_destroy(entry_hash);
        session_hash = NULL;
-       entry_hash = NULL;
 
        dbus_connection_unref(connection);
 }
-- 
1.8.4.rc0.1.g8f6a3e5

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

Reply via email to