Skip to content

Commit

Permalink
qemu-io: check registered fds in command_loop()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
kazum authored and kevmw committed Jun 22, 2010
1 parent 078a458 commit 7d7d975
Showing 1 changed file with 30 additions and 3 deletions.
33 changes: 30 additions & 3 deletions cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <getopt.h>

#include "cmd.h"
#include "qemu-aio.h"

#define _(x) x /* not gettext support yet */

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 7d7d975

Please sign in to comment.