diff options
Diffstat (limited to 'block/win32-aio.c')
-rw-r--r-- | block/win32-aio.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/block/win32-aio.c b/block/win32-aio.c index b43b1667ee..8e417f70ae 100644 --- a/block/win32-aio.c +++ b/block/win32-aio.c @@ -40,6 +40,7 @@ struct QEMUWin32AIOState { HANDLE hIOCP; EventNotifier e; int count; + bool is_aio_context_attached; }; typedef struct QEMUWin32AIOCB { @@ -114,7 +115,7 @@ static void win32_aio_cancel(BlockDriverAIOCB *blockacb) * wait for completion. */ while (!HasOverlappedIoCompleted(&waiocb->ov)) { - qemu_aio_wait(); + aio_poll(bdrv_get_aio_context(blockacb->bs), true); } } @@ -180,6 +181,20 @@ int win32_aio_attach(QEMUWin32AIOState *aio, HANDLE hfile) } } +void win32_aio_detach_aio_context(QEMUWin32AIOState *aio, + AioContext *old_context) +{ + aio_set_event_notifier(old_context, &aio->e, NULL); + aio->is_aio_context_attached = false; +} + +void win32_aio_attach_aio_context(QEMUWin32AIOState *aio, + AioContext *new_context) +{ + aio->is_aio_context_attached = true; + aio_set_event_notifier(new_context, &aio->e, win32_aio_completion_cb); +} + QEMUWin32AIOState *win32_aio_init(void) { QEMUWin32AIOState *s; @@ -194,8 +209,6 @@ QEMUWin32AIOState *win32_aio_init(void) goto out_close_efd; } - qemu_aio_set_event_notifier(&s->e, win32_aio_completion_cb); - return s; out_close_efd: @@ -207,7 +220,7 @@ out_free_state: void win32_aio_cleanup(QEMUWin32AIOState *aio) { - qemu_aio_set_event_notifier(&aio->e, NULL); + assert(!aio->is_aio_context_attached); CloseHandle(aio->hIOCP); event_notifier_cleanup(&aio->e); g_free(aio); |