aboutsummaryrefslogtreecommitdiffstats
path: root/cmd.c
diff options
context:
space:
mode:
authorMORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>2010-06-21 04:03:52 +0900
committerKevin Wolf <kwolf@redhat.com>2010-06-22 14:38:02 +0200
commit7d7d975c67aaa48a6aaf1630c143a453606567b1 (patch)
tree3ad41d49cde986a660cf64a6aa115f617563466b /cmd.c
parent078a458e077d6b0db262c4b05fee51d01de2d1d2 (diff)
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.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/cmd.c b/cmd.c
index 2336334ee..db2c9c4c5 100644
--- a/cmd.c
+++ b/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;