qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 10/10] aio-win32: add support for sockets


From: TeLeMan
Subject: Re: [Qemu-devel] [PATCH 10/10] aio-win32: add support for sockets
Date: Fri, 12 Sep 2014 09:43:29 +0800

On Wed, Jul 9, 2014 at 5:53 PM, Paolo Bonzini <address@hidden> wrote:
> Uses the same select/WSAEventSelect scheme as main-loop.c.
> WSAEventSelect() is edge-triggered, so it cannot be used
> directly, but it is still used as a way to exit from a
> blocking g_poll().
>
> Before g_poll() is called, we poll sockets with a non-blocking
> select() to achieve the level-triggered semantics we require:
> if a socket is ready, the g_poll() is made non-blocking too.
>
> Based on a patch from Or Goshen.
>
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
>  aio-win32.c         | 150 
> ++++++++++++++++++++++++++++++++++++++++++++++++++--
>  block/Makefile.objs |   2 -
>  include/block/aio.h |   2 -
>  3 files changed, 145 insertions(+), 9 deletions(-)
>
> diff --git a/aio-win32.c b/aio-win32.c
> index 4542270..61e3d2d 100644
> --- a/aio-win32.c
> +++ b/aio-win32.c
>
> @@ -149,10 +279,15 @@ bool aio_poll(AioContext *ctx, bool blocking)
>  {
>      AioHandler *node;
>      HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
> -    bool was_dispatching, progress, first;
> +    bool was_dispatching, progress, have_select_revents, first;
have_select_revents has no initial value.

>      int count;
>      int timeout;
>
> +    if (aio_prepare(ctx)) {
> +        blocking = false;
> +        have_select_revents = true;
> +    }
> +
>      was_dispatching = ctx->dispatching;
>      progress = false;
>
> @@ -183,6 +318,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
>
>      /* wait until next event */
>      while (count > 0) {
> +        HANDLE event;
>          int ret;
>
>          timeout = blocking
> @@ -196,13 +332,17 @@ bool aio_poll(AioContext *ctx, bool blocking)
>          first = false;
>
>          /* if we have any signaled events, dispatch event */
> -        if ((DWORD) (ret - WAIT_OBJECT_0) >= count) {
> +        event = NULL;
> +        if ((DWORD) (ret - WAIT_OBJECT_0) < count) {
> +            event = events[ret - WAIT_OBJECT_0];
> +        } else if (!have_select_revents) {
>              break;
>          }
>
> +        have_select_revents = false;
>          blocking = false;
>
> -        progress |= aio_dispatch_handlers(ctx, events[ret - WAIT_OBJECT_0]);
> +        progress |= aio_dispatch_handlers(ctx, event);
>
>          /* Try again, but only call each handler once.  */
>          events[ret - WAIT_OBJECT_0] = events[--count];
> diff --git a/block/Makefile.objs b/block/Makefile.objs
> index fd88c03..07eabf7 100644
> --- a/block/Makefile.objs
> +++ b/block/Makefile.objs
> @@ -10,7 +10,6 @@ block-obj-$(CONFIG_WIN32) += raw-win32.o win32-aio.o
>  block-obj-$(CONFIG_POSIX) += raw-posix.o
>  block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
>
> -ifeq ($(CONFIG_POSIX),y)
>  block-obj-y += nbd.o nbd-client.o sheepdog.o
>  block-obj-$(CONFIG_LIBISCSI) += iscsi.o
>  block-obj-$(CONFIG_LIBNFS) += nfs.o
> @@ -18,7 +17,6 @@ block-obj-$(CONFIG_CURL) += curl.o
>  block-obj-$(CONFIG_RBD) += rbd.o
>  block-obj-$(CONFIG_GLUSTERFS) += gluster.o
>  block-obj-$(CONFIG_LIBSSH2) += ssh.o
> -endif
>
>  common-obj-y += stream.o
>  common-obj-y += commit.o
> diff --git a/include/block/aio.h b/include/block/aio.h
> index d129e22..78fa2ee 100644
> --- a/include/block/aio.h
> +++ b/include/block/aio.h
> @@ -239,7 +239,6 @@ bool aio_dispatch(AioContext *ctx);
>   */
>  bool aio_poll(AioContext *ctx, bool blocking);
>
> -#ifdef CONFIG_POSIX
>  /* Register a file descriptor and associated callbacks.  Behaves very 
> similarly
>   * to qemu_set_fd_handler2.  Unlike qemu_set_fd_handler2, these callbacks 
> will
>   * be invoked when using aio_poll().
> @@ -252,7 +251,6 @@ void aio_set_fd_handler(AioContext *ctx,
>                          IOHandler *io_read,
>                          IOHandler *io_write,
>                          void *opaque);
> -#endif
>
>  /* Register an event notifier and associated callbacks.  Behaves very 
> similarly
>   * to event_notifier_set_handler.  Unlike event_notifier_set_handler, these 
> callbacks
> --
> 1.9.3
>
>



reply via email to

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