On Wed, Jul 9, 2014 at 5:53 PM, Paolo Bonzini <pbonz...@redhat.com> 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 <pbonz...@redhat.com> > --- > 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
> @@ -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) { when (ret - WAIT_OBJECT_0) >= count and have_select_revents is true, the following events[ret - WAIT_OBJECT_0] will be overflowed. > 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];