From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52697) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XSFtc-0006sJ-9P for qemu-devel@nongnu.org; Thu, 11 Sep 2014 21:43:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XSFtb-0002b4-5F for qemu-devel@nongnu.org; Thu, 11 Sep 2014 21:43:32 -0400 Received: from mail-we0-x232.google.com ([2a00:1450:400c:c03::232]:59535) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XSFta-0002ar-RU for qemu-devel@nongnu.org; Thu, 11 Sep 2014 21:43:31 -0400 Received: by mail-we0-f178.google.com with SMTP id q58so39666wes.37 for ; Thu, 11 Sep 2014 18:43:30 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <1404899590-24973-11-git-send-email-pbonzini@redhat.com> References: <1404899590-24973-1-git-send-email-pbonzini@redhat.com> <1404899590-24973-11-git-send-email-pbonzini@redhat.com> Date: Fri, 12 Sep 2014 09:43:29 +0800 Message-ID: From: TeLeMan Content-Type: text/plain; charset=UTF-8 Subject: Re: [Qemu-devel] [PATCH 10/10] aio-win32: add support for sockets List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: qemu-devel On Wed, Jul 9, 2014 at 5:53 PM, Paolo Bonzini 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 > --- > 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 > >