From 21bd2c1678eb66cd2361e099f4f93739f2e30ba3 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 11 Aug 2011 16:56:17 +0200 Subject: [PATCH] session: Split test_and_disconnect() Do split the testing into its own function and also reset the entry member back before we call __connman_service_disconnect(). This is necessary because calling __connman_serivice_disconnect() we can end up beeing called session_changed() before we have updated the entry. --- src/session.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/session.c b/src/session.c index f1a0ed3..9e78a4a 100644 --- a/src/session.c +++ b/src/session.c @@ -785,37 +785,52 @@ static connman_bool_t explicit_connect(enum connman_session_reason reason) return FALSE; } -static void test_and_disconnect(struct connman_session *session) +static connman_bool_t explicit_disconnect(struct connman_session *session) { struct session_info *info = session->info; if (info->entry == NULL) - return; + return FALSE; - DBG("session %p reason %s service %p state %d", + DBG("session %p, reason %s service %p state %d", session, reason2string(info->entry->reason), info->entry->service, info->entry->state); if (explicit_connect(info->entry->reason) == FALSE) - goto out; + return FALSE; - if (__connman_service_session_dec(info->entry->service) == TRUE) - goto out; + if (__connman_service_session_dec(info->entry->service) == FALSE) + return FALSE; if (ecall_session != NULL && ecall_session != session) - goto out; + return FALSE; - __connman_service_disconnect(info->entry->service); + return TRUE; +} - /* - * TODO: We should mark this entry as pending work. In case - * disconnect fails we just unassign this session from the - * service and can't do anything later on it - */ +static void test_and_disconnect(struct connman_session *session) +{ + struct session_info *info = session->info; + struct service_entry *entry; + connman_bool_t disconnect; + + disconnect = explicit_disconnect(session); + + entry = info->entry; -out: info->online = FALSE; info->entry = NULL; + + if (disconnect == TRUE) { + DBG("disconnect service %p", entry->service); + + /* + * TODO: We should mark this entry as pending work. In case + * disconnect fails we just unassign this session from the + * service and can't do anything later on it + */ + __connman_service_disconnect(entry->service); + } } static void select_and_connect(struct connman_session *session, -- 2.7.4