qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [RFC] [PATCHv8 12/30] aio / timers: aio_ctx_prepare set


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [RFC] [PATCHv8 12/30] aio / timers: aio_ctx_prepare sets timeout from AioContext timers
Date: Fri, 09 Aug 2013 12:04:54 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7

Il 08/08/2013 23:42, Alex Bligh ha scritto:
> 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 2051921..dd27459 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);
>              } 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);

Again, if we do the "two AioContext" tricks, the
timerlistgroup_deadline_ns function would be internal to AioContext.

Paolo

>  }
>  
>  static gboolean
> 




reply via email to

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