From patchwork Tue Jun 22 14:09:30 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 56517 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 51025B6F0E for ; Wed, 23 Jun 2010 00:34:27 +1000 (EST) Received: from localhost ([127.0.0.1]:47901 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OR4Vd-00024h-AX for incoming@patchwork.ozlabs.org; Tue, 22 Jun 2010 10:31:29 -0400 Received: from [140.186.70.92] (port=43356 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OR4Aq-0005ki-1I for qemu-devel@nongnu.org; Tue, 22 Jun 2010 10:10:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OR4Ao-0007do-JH for qemu-devel@nongnu.org; Tue, 22 Jun 2010 10:09:59 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47865) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OR4Ao-0007dZ-CF for qemu-devel@nongnu.org; Tue, 22 Jun 2010 10:09:58 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o5ME9udR011657 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jun 2010 10:09:56 -0400 Received: from localhost.localdomain (dhcp-5-217.str.redhat.com [10.32.5.217]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o5ME9fjv024621; Tue, 22 Jun 2010 10:09:55 -0400 From: Kevin Wolf To: anthony@codemonkey.ws Date: Tue, 22 Jun 2010 16:09:30 +0200 Message-Id: <1277215773-27357-12-git-send-email-kwolf@redhat.com> In-Reply-To: <1277215773-27357-1-git-send-email-kwolf@redhat.com> References: <1277215773-27357-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: kwolf@redhat.com, qemu-devel@nongnu.org Subject: [Qemu-devel] [PATCH 11/14] 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 From: MORITA Kazutaka 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 Signed-off-by: Kevin Wolf --- 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;