On Sat, Sep 13, 2014 at 6:33 PM, Paolo Bonzini <pbonz...@redhat.com> wrote: > Il 13/09/2014 04:22, TeLeMan ha scritto: >> On Fri, Sep 12, 2014 at 6:05 PM, Paolo Bonzini <pbonz...@redhat.com> wrote: >>> Il 12/09/2014 03:39, TeLeMan ha scritto: >>>> On Wed, Jul 9, 2014 at 5:53 PM, Paolo Bonzini <pbonz...@redhat.com> wrote: >>>>> diff --git a/aio-win32.c b/aio-win32.c >>>>> index 4542270..61e3d2d 100644 >>>>> --- a/aio-win32.c >>>>> +++ b/aio-win32.c >>>>> + bool was_dispatching, progress, have_select_revents, first; >>>> have_select_revents has no initial value. >>> >>> Good catch here... >>> >>>> >>>>> @@ -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. >>> >>> ... this instead is not a problem, ret - WAIT_OBJECT_0 can be at most >>> equal to count, and events[] is declared with MAXIMUM_WAIT_OBJECTS + 1 >>> places. So the >>> >>> events[ret - WAIT_OBJECT_0] = events[--count]; >>> >>> is equal to >>> >>> events[count] = events[count - 1]; >>> --count; >>> >>> and this is harmless. >> >> WAIT_ABANDONED_0 & WAIT_TIMEOUT & WAIT_FAILED are larger than >> MAXIMUM_WAIT_OBJECTS. > > WAIT_ABANDONED_0 and WAIT_FAILED cannot happen, but you're right about > WAIT_TIMEOUT. Are you going to send a patch?
No, because I was rejected to submit the patch, so I just report the issues. > Paolo > >>> Paolo >>> >>>>> 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]; >>> >> >> >