From patchwork Sun Jun 20 19:03:52 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: MORITA Kazutaka X-Patchwork-Id: 56269 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 3A29E1007D4 for ; Mon, 21 Jun 2010 05:06:27 +1000 (EST) Received: from localhost ([127.0.0.1]:60961 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OQPqa-0004in-GL for incoming@patchwork.ozlabs.org; Sun, 20 Jun 2010 15:06:24 -0400 Received: from [140.186.70.92] (port=57604 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OQPpI-0004Ow-Tx for qemu-devel@nongnu.org; Sun, 20 Jun 2010 15:05:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OQPpH-00035l-AA for qemu-devel@nongnu.org; Sun, 20 Jun 2010 15:05:04 -0400 Received: from sh.osrg.net ([192.16.179.4]:45032) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OQPpG-000353-PW for qemu-devel@nongnu.org; Sun, 20 Jun 2010 15:05:03 -0400 Received: from fs.osrg.net (postfix@fs.osrg.net [10.0.0.12]) by sh.osrg.net (8.14.3/8.14.3/OSRG-NET) with ESMTP id o5KJ4sRQ013644; Mon, 21 Jun 2010 04:04:55 +0900 Received: from localhost (dfs1401.osrg.net [10.68.14.1]) by fs.osrg.net (Postfix) with ESMTP id D6AFB3E005E; Mon, 21 Jun 2010 04:04:54 +0900 (JST) From: MORITA Kazutaka To: kwolf@redhat.com Date: Mon, 21 Jun 2010 04:03:52 +0900 Message-Id: <1277060632-7768-1-git-send-email-morita.kazutaka@lab.ntt.co.jp> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <4C1B9D01.4020801@redhat.com> References: <4C1B9D01.4020801@redhat.com> X-Dispatcher: imput version 20070423(IM149) Lines: 103 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-3.0 (sh.osrg.net [192.16.179.4]); Mon, 21 Jun 2010 04:04:55 +0900 (JST) X-Virus-Scanned: clamav-milter 0.96.1 at sh X-Virus-Status: Clean X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: qemu-devel@nongnu.org, morita.kazutaka@lab.ntt.co.jp Subject: [Qemu-devel] [PATCH v2] qemu-io: check registered fds in command_loop() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- It seems that the QEMU aio implementation doesn't allow to call qemu_aio_wait() in the aio handler, so the previous patch is broken. This patch only checks that STDIO is ready to read a line in the aio handler, and invokes a command in command_loop(). I think this also fixes the problem which occurs in qemu-iotests. 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 #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;