[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 11/14] qemu-io: check registered fds in command_loop
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 11/14] qemu-io: check registered fds in command_loop() |
Date: |
Tue, 22 Jun 2010 16:09:30 +0200 |
From: MORITA Kazutaka <address@hidden>
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 <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
cmd.c | 33 ++++++++++++++++++++++++++++++---
1 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/cmd.c b/cmd.c
index 2336334..db2c9c4 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;
--
1.6.6.1
- [Qemu-devel] [PULL 00/14] Block patches, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 02/14] scsi-bus: Add MAINTENANCE_IN and MAINTENANCE_OUT SCSIRequest xfer and mode assignments, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 03/14] block: fix physical_block_size calculation, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 01/14] scsi-bus: Add PERSISTENT_RESERVE_OUT SCSIRequest->cmd.mode setup, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 05/14] block: Add bdrv_(p)write_sync, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 04/14] monitor: allow device to be ejected if no disk is inserted, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 07/14] qcow: Use bdrv_(p)write_sync for metadata writes, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 09/14] vmdk: Use bdrv_(p)write_sync for metadata writes, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 06/14] cow: Use bdrv_(p)write_sync for metadata writes, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 11/14] qemu-io: check registered fds in command_loop(),
Kevin Wolf <=
- [Qemu-devel] [PATCH 12/14] virtio-blk: fix the list operation in virtio_blk_load()., Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 08/14] qcow2: Use bdrv_(p)write_sync for metadata writes, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 13/14] qcow2: Fix qemu-img check segfault on corrupted images, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 10/14] vpc: Use bdrv_(p)write_sync for metadata writes, Kevin Wolf, 2010/06/22
- [Qemu-devel] [PATCH 14/14] qcow2: Don't try to check tables that couldn't be loaded, Kevin Wolf, 2010/06/22