qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] Re: [PATCH 1/2] qemu-io: retry fgets() when errno is EI


From: MORITA Kazutaka
Subject: Re: [Qemu-devel] Re: [PATCH 1/2] qemu-io: retry fgets() when errno is EINTRg
Date: Fri, 18 Jun 2010 13:11:33 +0900
User-agent: Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (Gojō) APEL/10.7 Emacs/22.2 (x86_64-pc-linux-gnu) MULE/5.0 (SAKAKI)

At Thu, 17 Jun 2010 18:18:18 +0100,
Jamie Lokier wrote:
> 
> 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 <address@hidden>
> > >>> ---
> > >>>  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
> 

I think It is another problem whether fgets() retries internally when
a read system call is interrupted.  We should handle EINTR if the
system call can set EINTR.  I think a read() doesn't return with EINTR
if it doesn't block on Linux environment, but it may be not true on
other operating systems.

I send the fixed patch.  I'm not sure this patch is really needed, but
doesn't hurt anyway.

=
posix-aio-compat sends a signal in aio operations, so we should
consider that fgets() could be interrupted here.

Signed-off-by: MORITA Kazutaka <address@hidden>
---
 cmd.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/cmd.c b/cmd.c
index aee2a38..733bacd 100644
--- a/cmd.c
+++ b/cmd.c
@@ -293,14 +293,18 @@ fetchline(void)
 char *
 fetchline(void)
 {
-       char    *p, *line = malloc(MAXREADLINESZ);
+       char    *p, *line = malloc(MAXREADLINESZ), *ret;
 
        if (!line)
                return NULL;
-       if (!fgets(line, MAXREADLINESZ, stdin)) {
-               free(line);
-               return NULL;
-       }
+    do {
+        ret = fgets(line, MAXREADLINESZ, stdin);
+    } while (ret == NULL && errno == EINTR);
+
+    if (ret == NULL) {
+        free(line);
+        return NULL;
+    }
        p = line + strlen(line);
        if (p != line && p[-1] == '\n')
                p[-1] = '\0';
-- 
1.5.6.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]