From: Daniel Wagner <[email protected]>

When Session.Disconnect() is called, only services which are not
activily used by any other session will be disconnected.

The free ride session are not counted.
---
 src/session.c |   29 +++++++++++++++++++++++++++--
 1 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/session.c b/src/session.c
index 5f80e5a..ea2c7ff 100644
--- a/src/session.c
+++ b/src/session.c
@@ -730,6 +730,29 @@ static void update_info(struct session_info *info)
        }
 }
 
+static int count_service_usage(struct connman_service *service)
+{
+       struct connman_session *session;
+       struct session_info *info;
+       GHashTableIter iter;
+       gpointer key, value;
+       int count = 0;
+
+       g_hash_table_iter_init(&iter, session_hash);
+
+       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+               session = value;
+               info = &session->info;
+
+               if (info->service != service)
+                       continue;
+
+               count++;
+       }
+
+       return count;
+}
+
 static void select_and_connect(struct connman_session *session,
                                connman_bool_t do_connect)
 {
@@ -820,8 +843,10 @@ static void session_changed(struct connman_session 
*session,
                if (info->online == FALSE)
                        break;
 
-               if (info->service != NULL)
-                       __connman_service_disconnect(info->service);
+               if (info->service != NULL) {
+                       if (count_service_usage(info->service) == 0)
+                               __connman_service_disconnect(info->service);
+               }
 
                info->service = NULL;
 
-- 
1.7.4.4

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

Reply via email to