From: Daniel Wagner <[email protected]>
We want to be able to modify and update sessions in future. Therefore
we track all active session in a global list.
---
src/connman.h | 5 ++++-
src/service.c | 23 ++++++++++++-----------
src/session.c | 16 +++++++++-------
3 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/src/connman.h b/src/connman.h
index 69e7e8e..4133df6 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -698,7 +698,10 @@ int __connman_service_indicate_default(struct
connman_service *service);
int __connman_service_connect(struct connman_service *service);
int __connman_service_disconnect(struct connman_service *service);
int __connman_service_disconnect_all(void);
-void __connman_service_set_active_session(bool enable, GSList *list);
+
+struct connman_session;
+void __connman_service_set_active_session(struct connman_session *session,
+ bool enable, GSList *list);
void __connman_service_auto_connect(void);
bool __connman_service_remove(struct connman_service *service);
bool __connman_service_is_provider_pending(struct connman_service *service);
diff --git a/src/service.c b/src/service.c
index 6290efc..ae4f9a9 100644
--- a/src/service.c
+++ b/src/service.c
@@ -42,6 +42,8 @@
static DBusConnection *connection = NULL;
static GList *service_list = NULL;
+static GSList *session_list = NULL;
+static int active_sessions[MAX_CONNMAN_SERVICE_TYPES] = {};
static GHashTable *service_hash = NULL;
static GSList *counter_list = NULL;
static unsigned int autoconnect_timeout = 0;
@@ -3413,18 +3415,16 @@ static bool is_ignore(struct connman_service *service)
return false;
}
-static int active_sessions[MAX_CONNMAN_SERVICE_TYPES] = {};
-static int active_count = 0;
-
-void __connman_service_set_active_session(bool enable, GSList *list)
+void __connman_service_set_active_session(struct connman_session *session,
+ bool enable, GSList *list)
{
if (!list)
return;
if (enable)
- active_count++;
+ session_list = g_slist_prepend(session_list, session);
else
- active_count--;
+ session_list = g_slist_remove(session_list, session);
while (list != NULL) {
enum connman_service_type type = GPOINTER_TO_INT(list->data);
@@ -3456,7 +3456,7 @@ void __connman_service_set_active_session(bool enable,
GSList *list)
active_sessions[CONNMAN_SERVICE_TYPE_WIFI],
active_sessions[CONNMAN_SERVICE_TYPE_BLUETOOTH],
active_sessions[CONNMAN_SERVICE_TYPE_CELLULAR],
- active_count);
+ g_slist_length(session_list));
}
struct preferred_tech_data {
@@ -3520,7 +3520,8 @@ static bool auto_connect_service(GList *services, bool
preferred)
bool autoconnecting = false;
GList *list;
- DBG("preferred %d sessions %d", preferred, active_count);
+ DBG("preferred %d sessions %d", preferred,
+ g_slist_length(session_list));
ignore[CONNMAN_SERVICE_TYPE_VPN] = true;
@@ -3536,7 +3537,7 @@ static bool auto_connect_service(GList *services, bool
preferred)
if (service->pending ||
is_connecting(service) ||
is_connected(service)) {
- if (!active_count)
+ if (!session_list)
return true;
ignore[service->type] = true;
@@ -3571,7 +3572,7 @@ static bool auto_connect_service(GList *services, bool
preferred)
service->userconnect = false;
__connman_service_connect(service);
- if (!active_count)
+ if (!session_list)
return true;
ignore[service->type] = true;
@@ -3595,7 +3596,7 @@ static gboolean run_auto_connect(gpointer data)
g_list_free(preferred_tech);
}
- if (!autoconnecting || active_count)
+ if (!autoconnecting || session_list)
auto_connect_service(service_list, false);
return FALSE;
diff --git a/src/session.c b/src/session.c
index 5ca2d30..554bc85 100644
--- a/src/session.c
+++ b/src/session.c
@@ -410,7 +410,7 @@ static void cleanup_session_final(struct connman_session
*session)
DBG("remove %s", session->session_path);
if (info->connect)
- __connman_service_set_active_session(false,
+ __connman_service_set_active_session(session, false,
session->info->config.allowed_bearers);
g_slist_free(session->user_allowed_bearers);
@@ -946,7 +946,7 @@ static void trigger_disconnect(struct connman_session
*session)
if (!info->connect)
return;
- __connman_service_set_active_session(false,
+ __connman_service_set_active_session(session, false,
info->config.allowed_bearers);
info->connect = false;
@@ -961,7 +961,7 @@ static void trigger_connect(struct connman_session *session)
return;
info->connect = true;
- __connman_service_set_active_session(true,
+ __connman_service_set_active_session(session, true,
info->config.allowed_bearers);
__connman_service_auto_connect();
@@ -999,14 +999,14 @@ int connman_session_config_update(struct connman_session
*session)
return err;
if (info->connect)
- __connman_service_set_active_session(false,
+ __connman_service_set_active_session(session, false,
info->config.allowed_bearers);
g_slist_free(info->config.allowed_bearers);
info->config.allowed_bearers = allowed_bearers;
if (info->connect)
- __connman_service_set_active_session(true,
+ __connman_service_set_active_session(session, true,
info->config.allowed_bearers);
info->config.type = apply_policy_on_type(
@@ -1098,7 +1098,8 @@ static DBusMessage *change_session(DBusConnection *conn,
return __connman_error_failed(msg, -err);
if (info->connect)
- __connman_service_set_active_session(false,
+ __connman_service_set_active_session(session,
+ false,
info->config.allowed_bearers);
g_slist_free(info->config.allowed_bearers);
@@ -1113,7 +1114,8 @@ static DBusMessage *change_session(DBusConnection *conn,
return __connman_error_failed(msg, -err);
if (info->connect)
- __connman_service_set_active_session(true,
+ __connman_service_set_active_session(session,
+ true,
info->config.allowed_bearers);
} else {
--
1.8.4.474.g128a96c
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman