mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-13 08:34:38 +00:00
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:
parent
078a458e07
commit
7d7d975c67
33
cmd.c
33
cmd.c
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user