From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=48803 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OPIjh-0007Ny-9Q for qemu-devel@nongnu.org; Thu, 17 Jun 2010 13:18:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OPIjf-0001GT-7D for qemu-devel@nongnu.org; Thu, 17 Jun 2010 13:18:41 -0400 Received: from mail2.shareable.org ([80.68.89.115]:36703) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OPIjf-0001Em-2q for qemu-devel@nongnu.org; Thu, 17 Jun 2010 13:18:39 -0400 Date: Thu, 17 Jun 2010 18:18:18 +0100 From: Jamie Lokier Subject: Re: [Qemu-devel] Re: [PATCH 1/2] qemu-io: retry fgets() when errno is EINTRg Message-ID: <20100617171818.GB4979@shareable.org> References: <1276624421-23999-1-git-send-email-morita.kazutaka@lab.ntt.co.jp> <1276624421-23999-2-git-send-email-morita.kazutaka@lab.ntt.co.jp> <4C18AFCF.2000304@redhat.com> <87pqzqgbsw.wl%morita.kazutaka@lab.ntt.co.jp> <4C19DC88.4080208@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C19DC88.4080208@redhat.com> List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf Cc: qemu-devel@nongnu.org, MORITA Kazutaka Kevin Wolf wrote: > Am 16.06.2010 18:52, schrieb MORITA Kazutaka: > > At Wed, 16 Jun 2010 13:04:47 +0200, > > Kevin Wolf wrote: > >> > >> Am 15.06.2010 19:53, schrieb MORITA Kazutaka: > >>> posix-aio-compat sends a signal in aio operations, so we should > >>> consider that fgets() could be interrupted here. > >>> > >>> Signed-off-by: MORITA Kazutaka > >>> --- > >>> cmd.c | 3 +++ > >>> 1 files changed, 3 insertions(+), 0 deletions(-) > >>> > >>> diff --git a/cmd.c b/cmd.c > >>> index 2336334..460df92 100644 > >>> --- a/cmd.c > >>> +++ b/cmd.c > >>> @@ -272,7 +272,10 @@ fetchline(void) > >>> return NULL; > >>> printf("%s", get_prompt()); > >>> fflush(stdout); > >>> +again: > >>> if (!fgets(line, MAXREADLINESZ, stdin)) { > >>> + if (errno == EINTR) > >>> + goto again; > >>> free(line); > >>> return NULL; > >>> } > >> > >> This looks like a loop replaced by goto (and braces are missing). What > >> about this instead? > >> > >> do { > >> ret = fgets(...) > >> } while (ret == NULL && errno == EINTR) > >> > >> if (ret == NULL) { > >> fail > >> } > >> > > > > I agree. > > > > However, it seems that my second patch have already solved the > > problem. We register this readline routines as an aio handler now, so > > fgets() does not block and cannot return with EINTR. > > > > This patch looks no longer needed, sorry. > > Good point. Thanks for having a look. Anyway, are you sure stdio functions can be interrupted with EINTR? Linus reminds us that some stdio functions have to retry internally anyway: http://comments.gmane.org/gmane.comp.version-control.git/18285 -- Jamie