mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-18 15:42:09 -06: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
1 changed files with 30 additions and 3 deletions
33
cmd.c
33
cmd.c
|
@ -24,6 +24,7 @@
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
|
||||||
#include "cmd.h"
|
#include "cmd.h"
|
||||||
|
#include "qemu-aio.h"
|
||||||
|
|
||||||
#define _(x) x /* not gettext support yet */
|
#define _(x) x /* not gettext support yet */
|
||||||
|
|
||||||
|
@ -149,10 +150,20 @@ add_args_command(
|
||||||
args_func = af;
|
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
|
void
|
||||||
command_loop(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 *input;
|
||||||
char **v;
|
char **v;
|
||||||
const cmdinfo_t *ct;
|
const cmdinfo_t *ct;
|
||||||
|
@ -186,7 +197,21 @@ command_loop(void)
|
||||||
free(cmdline);
|
free(cmdline);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!done) {
|
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)
|
if ((input = fetchline()) == NULL)
|
||||||
break;
|
break;
|
||||||
v = breakline(input, &c);
|
v = breakline(input, &c);
|
||||||
|
@ -199,7 +224,11 @@ command_loop(void)
|
||||||
v[0]);
|
v[0]);
|
||||||
}
|
}
|
||||||
doneline(input, v);
|
doneline(input, v);
|
||||||
|
|
||||||
|
prompted = 0;
|
||||||
|
fetchable = 0;
|
||||||
}
|
}
|
||||||
|
qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* from libxcmd/input.c */
|
/* from libxcmd/input.c */
|
||||||
|
@ -270,8 +299,6 @@ fetchline(void)
|
||||||
|
|
||||||
if (!line)
|
if (!line)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("%s", get_prompt());
|
|
||||||
fflush(stdout);
|
|
||||||
if (!fgets(line, MAXREADLINESZ, stdin)) {
|
if (!fgets(line, MAXREADLINESZ, stdin)) {
|
||||||
free(line);
|
free(line);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue