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>
This commit is contained in:
MORITA Kazutaka 2010-06-21 04:03:52 +09:00 committed by Kevin Wolf
parent 078a458e07
commit 7d7d975c67
1 changed files with 30 additions and 3 deletions

33
cmd.c
View File

@ -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;