Re: [PATCH obexd 6/9] client: terminate queued transfers properly

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Mikel,

On Tue, Feb 21, 2012 at 10:46 AM, Mikel Astiz <mikel.astiz.oss@xxxxxxxxx> wrote:
> From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx>
>
> Previous implementation of session_terminate_transfer assumed that the
> transfer being terminated would always be the active one. However, it
> should be possible to cancel any queued transfer using the D-Bus api.
> ---
>  client/session.c |   32 ++++++++++++++++++++++++--------
>  1 files changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/client/session.c b/client/session.c
> index eaabcf9..50a6a5d 100644
> --- a/client/session.c
> +++ b/client/session.c
> @@ -762,18 +762,34 @@ static void session_terminate_transfer(struct obc_session *session,
>  {
>        struct pending_request *p = session->p;
>
> -       if (p == NULL || p->transfer != transfer)
> -               return;
> -
>        obc_session_ref(session);
>
> -       if (p->func)
> -               p->func(session, gerr, p->data);
> +       if (p != NULL && p->transfer == transfer) {
> +               if (p->func)
> +                       p->func(session, gerr, p->data);
>
> -       pending_request_free(p);
> -       session->p = NULL;
> +               pending_request_free(p);
> +               session->p = NULL;

Maybe a goto would be better here, since calling to callback and
freeing the pending request should common.

> -       session_process_queue(session);
> +               session_process_queue(session);
> +       } else {
> +               GList *l;
> +
> +               for (l = session->queue->head; l; l = l->next) {
> +                       p = l->data;
> +
> +                       if (p->transfer != transfer)
> +                               continue;
> +
> +                       g_queue_delete_link(session->queue, l);
> +
> +                       if (p->func)
> +                               p->func(session, gerr, p->data);
> +
> +                       pending_request_free(p);
> +                       break;
> +               }
> +       }

And here you can make use of g_queue_find_custom like we do in
g_obex_cancel_req.


-- 
Luiz Augusto von Dentz
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux