From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [RFC 3/3] gprs: Release context in driver and core when network is lost
Date: Thu, 31 May 2012 17:45:38 -0500 [thread overview]
Message-ID: <4FC7F492.1050205@gmail.com> (raw)
In-Reply-To: <1338458348-335-4-git-send-email-guillaume.zajac@linux.intel.com>
[-- Attachment #1: Type: text/plain, Size: 3938 bytes --]
Hi Guillaume,
On 05/31/2012 04:59 AM, Guillaume Zajac wrote:
> ---
> src/gprs.c | 84 +++++++++++++++++++++++++++++++++++++++++++++---------------
> 1 files changed, 63 insertions(+), 21 deletions(-)
>
> diff --git a/src/gprs.c b/src/gprs.c
> index 994607d..9ec0ca1 100644
> --- a/src/gprs.c
> +++ b/src/gprs.c
> @@ -48,6 +48,7 @@
>
> #define GPRS_FLAG_ATTACHING 0x1
> #define GPRS_FLAG_RECHECK 0x2
> +#define GPRS_FLAG_ATTACHED_UPDATE 0x4
>
> #define SETTINGS_STORE "gprs"
> #define SETTINGS_GROUP "Settings"
> @@ -1440,6 +1441,44 @@ void ofono_gprs_resume_notify(struct ofono_gprs *gprs)
> update_suspended_property(gprs, FALSE);
> }
>
> +static gboolean check_active_contexts(struct ofono_gprs *gprs)
Name this have_active_contexts
> +{
> + GSList *l;
> + struct pri_context *ctx;
> +
> + for (l = gprs->contexts; l; l = l->next) {
> + ctx = l->data;
> +
> + if (ctx->active == TRUE)
> + return TRUE;
> + }
> +
> + return FALSE;
> +}
> +
> +static void release_active_contexts(struct ofono_gprs *gprs)
> +{
> + GSList *l;
> + struct pri_context *ctx;
> +
> + for (l = gprs->contexts; l; l = l->next) {
> + struct ofono_gprs_context *gc;
> +
> + ctx = l->data;
> +
> + if (ctx->active == FALSE)
> + continue;
> +
> + /* This context is already being messed with */
> + if (ctx->pending)
> + continue;
> +
> + gc = ctx->context_driver;
> +
> + gc->driver->release_primary(gc, ctx->context.cid);
You better check that this driver function is implemented
> + }
> +}
> +
> static void gprs_attached_update(struct ofono_gprs *gprs)
> {
> DBusConnection *conn = ofono_dbus_get_connection();
> @@ -1454,30 +1493,23 @@ static void gprs_attached_update(struct ofono_gprs *gprs)
> if (attached == gprs->attached)
> return;
>
> - gprs->attached = attached;
> -
> - if (gprs->attached == FALSE) {
> - GSList *l;
> - struct pri_context *ctx;
> -
> - for (l = gprs->contexts; l; l = l->next) {
> - ctx = l->data;
> -
> - if (ctx->active == FALSE)
> - continue;
> -
> - pri_reset_context_settings(ctx);
> - release_context(ctx);
> -
> - value = FALSE;
> - ofono_dbus_signal_property_changed(conn, ctx->path,
> - OFONO_CONNECTION_CONTEXT_INTERFACE,
> - "Active", DBUS_TYPE_BOOLEAN,&value);
> - }
> -
> + /*
> + * If an active context is found, a PPP session might be still active
> + * at driver level. "Attached" = TRUE property can't be signalled to
> + * the applications registered on GPRS properties.
> + * Active contexts have to be release at driver level.
> + */
> + if (attached == FALSE) {
> + release_active_contexts(gprs);
> gprs->bearer = -1;
> + } else if (check_active_contexts(gprs) == TRUE) {
> + gprs->flags |= GPRS_FLAG_ATTACHED_UPDATE;
> + release_active_contexts(gprs);
Why do we run the release operation here, wasn't it sufficient to run it
once on the Attached goes Detached transition above?
> + return;
> }
>
> + gprs->attached = attached;
> +
> path = __ofono_atom_get_path(gprs->atom);
> value = attached;
> ofono_dbus_signal_property_changed(conn, path,
> @@ -2266,6 +2298,16 @@ void ofono_gprs_context_deactivated(struct ofono_gprs_context *gc,
> OFONO_CONNECTION_CONTEXT_INTERFACE,
> "Active", DBUS_TYPE_BOOLEAN,&value);
> }
> +
> + /*
> + * If "Attached" property was about to be signalled as TRUE but there
> + * were still active contexts, try again to signal "Attached" property
> + * to registered applications after active contexts have been released.
> + */
> + if (gc->gprs->flags& GPRS_FLAG_ATTACHED_UPDATE) {
> + gc->gprs->flags&= ~GPRS_FLAG_ATTACHED_UPDATE;
> + gprs_attached_update(gc->gprs);
> + }
> }
>
> int ofono_gprs_context_driver_register(
Overall I like this approach, but lets get this tested really well.
Regards,
-Denis
next prev parent reply other threads:[~2012-05-31 22:45 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-31 9:59 [RFC 0/3] Fix crash when network is lost Guillaume Zajac
2012-05-31 9:59 ` [RFC 1/3] gprs-context: Add new driver entry Guillaume Zajac
2012-05-31 22:46 ` Denis Kenzior
2012-05-31 9:59 ` [RFC 2/3] gprs-context: Add new driver entry definition Guillaume Zajac
2012-05-31 9:59 ` [RFC 3/3] gprs: Release context in driver and core when network is lost Guillaume Zajac
2012-05-31 22:45 ` Denis Kenzior [this message]
2012-06-01 7:59 ` Guillaume Zajac
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FC7F492.1050205@gmail.com \
--to=denkenz@gmail.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.