Skip to content

Commit

Permalink
aio-win32: add aio_set_dispatching optimization
Browse files Browse the repository at this point in the history
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
bonzini authored and stefanhaRH committed Aug 29, 2014
1 parent 363285d commit 0a9dd16
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion aio-win32.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,12 +144,25 @@ bool aio_poll(AioContext *ctx, bool blocking)
{
AioHandler *node;
HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
bool progress, first;
bool was_dispatching, progress, first;
int count;
int timeout;

was_dispatching = ctx->dispatching;
progress = false;

/* aio_notify can avoid the expensive event_notifier_set if
* everything (file descriptors, bottom halves, timers) will
* be re-evaluated before the next blocking poll(). This is
* already true when aio_poll is called with blocking == false;
* if blocking == true, it is only true after poll() returns.
*
* If we're in a nested event loop, ctx->dispatching might be true.
* In that case we can restore it just before returning, but we
* have to clear it now.
*/
aio_set_dispatching(ctx, !blocking);

ctx->walking_handlers++;

/* fill fd sets */
Expand All @@ -170,6 +183,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
timeout = blocking
? qemu_timeout_ns_to_ms(aio_compute_timeout(ctx)) : 0;
ret = WaitForMultipleObjects(count, events, FALSE, timeout);
aio_set_dispatching(ctx, true);

if (first && aio_bh_poll(ctx)) {
progress = true;
Expand All @@ -191,5 +205,6 @@ bool aio_poll(AioContext *ctx, bool blocking)

progress |= timerlistgroup_run_timers(&ctx->tlg);

aio_set_dispatching(ctx, was_dispatching);
return progress;
}

0 comments on commit 0a9dd16

Please sign in to comment.