qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCHv11 13/31] aio / timers: aio_ctx_prepare sets tim


From: Wenchao Xia
Subject: Re: [Qemu-devel] [PATCHv11 13/31] aio / timers: aio_ctx_prepare sets timeout from AioContext timers
Date: Tue, 20 Aug 2013 11:08:58 +0800
User-agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8

于 2013-8-16 4:34, Alex Bligh 写道:
> Calculate the timeout in aio_ctx_prepare taking into account
> the timers attached to the AioContext.
> 
> Alter aio_ctx_check similarly.
> 
> Signed-off-by: Alex Bligh <address@hidden>
> ---
>   async.c |   13 +++++++++++--
>   1 file changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/async.c b/async.c
> index 2b9ba9b..d8656cc 100644
> --- a/async.c
> +++ b/async.c
> @@ -150,13 +150,14 @@ aio_ctx_prepare(GSource *source, gint    *timeout)
>   {
>       AioContext *ctx = (AioContext *) source;
>       QEMUBH *bh;
> +    int deadline;
> 
>       for (bh = ctx->first_bh; bh; bh = bh->next) {
>           if (!bh->deleted && bh->scheduled) {
>               if (bh->idle) {
>                   /* idle bottom halves will be polled at least
>                    * every 10ms */
> -                *timeout = 10;
> +                *timeout = qemu_soonest_timeout(*timeout, 10);
    glib will not set *timeout to a meaningful value before calling
aio_ctx_prepare(), right? If so, "*timeout = 10" should be used.

>               } else {
>                   /* non-idle bottom halves will be executed
>                    * immediately */
> @@ -166,6 +167,14 @@ aio_ctx_prepare(GSource *source, gint    *timeout)
>           }
>       }
> 
> +    deadline = qemu_timeout_ns_to_ms(timerlistgroup_deadline_ns(&ctx->tlg));
> +    if (deadline == 0) {
> +        *timeout = 0;
> +        return true;
> +    } else {
> +        *timeout = qemu_soonest_timeout(*timeout, deadline);
> +    }
> +
>       return false;
>   }
> 
> @@ -180,7 +189,7 @@ aio_ctx_check(GSource *source)
>               return true;
>       }
>       }
> -    return aio_pending(ctx);
> +    return aio_pending(ctx) || (timerlistgroup_deadline_ns(&ctx->tlg) == 0);
>   }
> 
>   static gboolean
> 


-- 
Best Regards

Wenchao Xia




reply via email to

[Prev in Thread] Current Thread [Next in Thread]