From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46855) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XNP4a-0007hD-4W for qemu-devel@nongnu.org; Fri, 29 Aug 2014 12:30:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XNP4U-0002s3-1H for qemu-devel@nongnu.org; Fri, 29 Aug 2014 12:30:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57216) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XNP4T-0002rt-Fi for qemu-devel@nongnu.org; Fri, 29 Aug 2014 12:30:41 -0400 From: Stefan Hajnoczi Date: Fri, 29 Aug 2014 17:29:43 +0100 Message-Id: <1409329803-20744-16-git-send-email-stefanha@redhat.com> In-Reply-To: <1409329803-20744-1-git-send-email-stefanha@redhat.com> References: <1409329803-20744-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PULL 15/35] AioContext: run bottom halves after polling List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , Stefan Hajnoczi , Paolo Bonzini From: Paolo Bonzini Make the dispatching phase the same before blocking and afterwards. The next patch will make aio_dispatch public and use it directly for the GSource case, instead of aio_poll. aio_poll can then be simplified heavily. Signed-off-by: Paolo Bonzini Signed-off-by: Stefan Hajnoczi --- aio-posix.c | 4 ++++ aio-win32.c | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/aio-posix.c b/aio-posix.c index 55706f8..798a3ff 100644 --- a/aio-posix.c +++ b/aio-posix.c @@ -264,6 +264,10 @@ bool aio_poll(AioContext *ctx, bool blocking) /* Run dispatch even if there were no readable fds to run timers */ aio_set_dispatching(ctx, true); + if (aio_bh_poll(ctx)) { + progress = true; + } + if (aio_dispatch(ctx)) { progress = true; } diff --git a/aio-win32.c b/aio-win32.c index 5e37b42..2ac38a8 100644 --- a/aio-win32.c +++ b/aio-win32.c @@ -143,7 +143,7 @@ bool aio_poll(AioContext *ctx, bool blocking) { AioHandler *node; HANDLE events[MAXIMUM_WAIT_OBJECTS + 1]; - bool progress; + bool progress, first; int count; int timeout; @@ -177,6 +177,7 @@ bool aio_poll(AioContext *ctx, bool blocking) } ctx->walking_handlers--; + first = true; /* wait until next event */ while (count > 0) { @@ -186,6 +187,11 @@ bool aio_poll(AioContext *ctx, bool blocking) ? qemu_timeout_ns_to_ms(aio_compute_timeout(ctx)) : 0; ret = WaitForMultipleObjects(count, events, FALSE, timeout); + if (first && aio_bh_poll(ctx)) { + progress = true; + } + first = false; + /* if we have any signaled events, dispatch event */ if ((DWORD) (ret - WAIT_OBJECT_0) >= count) { break; -- 1.9.3