diff options
author | MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp> | 2010-06-21 04:03:52 +0900 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2010-06-22 14:38:02 +0200 |
commit | 7d7d975c67aaa48a6aaf1630c143a453606567b1 (patch) | |
tree | 3ad41d49cde986a660cf64a6aa115f617563466b /cmd.c | |
parent | 078a458e077d6b0db262c4b05fee51d01de2d1d2 (diff) | |
download | qemu-7d7d975c67aaa48a6aaf1630c143a453606567b1.zip qemu-7d7d975c67aaa48a6aaf1630c143a453606567b1.tar.gz qemu-7d7d975c67aaa48a6aaf1630c143a453606567b1.tar.bz2 |
qemu-io: check registered fds in command_loop()
Some block drivers use an aio handler and do I/O completion routines
in it. However, the handler is not invoked if we only do
aio_read/write, because registered fds are not checked at all.
This patch registers an aio handler of STDIO to checks whether we can
read a command without blocking, and calls qemu_aio_wait() in
command_loop(). Any other handlers can be invoked when user input is
idle.
Signed-off-by: MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'cmd.c')
-rw-r--r-- | cmd.c | 33 |
1 files changed, 30 insertions, 3 deletions
@@ -24,6 +24,7 @@ #include <getopt.h> #include "cmd.h" +#include "qemu-aio.h" #define _(x) x /* not gettext support yet */ @@ -149,10 +150,20 @@ add_args_command( args_func = af; } +static void prep_fetchline(void *opaque) +{ + int *fetchable = opaque; + + qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL); + *fetchable= 1; +} + +static char *get_prompt(void); + void command_loop(void) { - int c, i, j = 0, done = 0; + int c, i, j = 0, done = 0, fetchable = 0, prompted = 0; char *input; char **v; const cmdinfo_t *ct; @@ -186,7 +197,21 @@ command_loop(void) free(cmdline); return; } + while (!done) { + if (!prompted) { + printf("%s", get_prompt()); + fflush(stdout); + qemu_aio_set_fd_handler(STDIN_FILENO, prep_fetchline, NULL, NULL, + NULL, &fetchable); + prompted = 1; + } + + qemu_aio_wait(); + + if (!fetchable) { + continue; + } if ((input = fetchline()) == NULL) break; v = breakline(input, &c); @@ -199,7 +224,11 @@ command_loop(void) v[0]); } doneline(input, v); + + prompted = 0; + fetchable = 0; } + qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL); } /* from libxcmd/input.c */ @@ -270,8 +299,6 @@ fetchline(void) if (!line) return NULL; - printf("%s", get_prompt()); - fflush(stdout); if (!fgets(line, MAXREADLINESZ, stdin)) { free(line); return NULL; |