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