qemu-io: use main_loop_wait

This will let timers run during aio_read and aio_write commands,
though not during synchronous commands.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Paolo Bonzini 2012-04-12 14:00:51 +02:00 committed by Kevin Wolf
parent 3ed9902528
commit a5a5238ee4
2 changed files with 9 additions and 8 deletions

10
cmd.c
View File

@ -25,6 +25,7 @@
#include "cmd.h" #include "cmd.h"
#include "qemu-aio.h" #include "qemu-aio.h"
#include "main-loop.h"
#define _(x) x /* not gettext support yet */ #define _(x) x /* not gettext support yet */
@ -146,7 +147,7 @@ static void prep_fetchline(void *opaque)
{ {
int *fetchable = opaque; int *fetchable = opaque;
qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL); qemu_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL);
*fetchable= 1; *fetchable= 1;
} }
@ -193,12 +194,11 @@ void command_loop(void)
if (!prompted) { if (!prompted) {
printf("%s", get_prompt()); printf("%s", get_prompt());
fflush(stdout); fflush(stdout);
qemu_aio_set_fd_handler(STDIN_FILENO, prep_fetchline, NULL, NULL, qemu_set_fd_handler(STDIN_FILENO, prep_fetchline, NULL, &fetchable);
NULL, &fetchable);
prompted = 1; prompted = 1;
} }
qemu_aio_wait(); main_loop_wait(false);
if (!fetchable) { if (!fetchable) {
continue; continue;
@ -221,7 +221,7 @@ void command_loop(void)
prompted = 0; prompted = 0;
fetchable = 0; fetchable = 0;
} }
qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL); qemu_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL);
} }
/* from libxcmd/input.c */ /* from libxcmd/input.c */

View File

@ -15,6 +15,7 @@
#include <libgen.h> #include <libgen.h>
#include "qemu-common.h" #include "qemu-common.h"
#include "main-loop.h"
#include "block_int.h" #include "block_int.h"
#include "cmd.h" #include "cmd.h"
#include "trace/control.h" #include "trace/control.h"
@ -295,7 +296,7 @@ static int do_aio_readv(QEMUIOVector *qiov, int64_t offset, int *total)
bdrv_aio_readv(bs, offset >> 9, qiov, qiov->size >> 9, bdrv_aio_readv(bs, offset >> 9, qiov, qiov->size >> 9,
aio_rw_done, &async_ret); aio_rw_done, &async_ret);
while (async_ret == NOT_DONE) { while (async_ret == NOT_DONE) {
qemu_aio_wait(); main_loop_wait(false);
} }
*total = qiov->size; *total = qiov->size;
@ -309,7 +310,7 @@ static int do_aio_writev(QEMUIOVector *qiov, int64_t offset, int *total)
bdrv_aio_writev(bs, offset >> 9, qiov, qiov->size >> 9, bdrv_aio_writev(bs, offset >> 9, qiov, qiov->size >> 9,
aio_rw_done, &async_ret); aio_rw_done, &async_ret);
while (async_ret == NOT_DONE) { while (async_ret == NOT_DONE) {
qemu_aio_wait(); main_loop_wait(false);
} }
*total = qiov->size; *total = qiov->size;
@ -352,7 +353,7 @@ static int do_aio_multiwrite(BlockRequest* reqs, int num_reqs, int *total)
} }
while (async_ret.num_done < num_reqs) { while (async_ret.num_done < num_reqs) {
qemu_aio_wait(); main_loop_wait(false);
} }
return async_ret.error < 0 ? async_ret.error : 1; return async_ret.error < 0 ? async_ret.error : 1;