[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
>
>