[Please excuse my editing] On Mon, Dec 17, 2001 at 10:33:13AM +0200, Andrew V. Samoilov wrote: > >is the following problem known? Sometimes (usually a few times a day :-( > >) if I press F4 to edit a .cc file with the internal editor, the > >Midnight Commander hangs up. Here is the description of the problem: > > > >--- > >404 for (;;) { > >405 c = fgetc (f); > >406 if (c == EOF) { > >407 if (errno == EINTR) > >408 continue; > >--- > > I cannot reproduce this, but it is possible if previous system call was > interrupted. > fgetc returns -1 on error and on end of file, so additional check needed. I've also tried to reproduce this w/o success. I think we need to call clearerr(_unlocked?) on line 408 above. (If found some usenet posts that indicated that this is indeed necessary on Solaris. (Sorry, I that was last week and I didn't save them.)) [I've done OS-/embedded-stuff all my life so I'm not very good at user-space things.] Some quotes from libc.info: Error Recovery ...big snip... Most errors that can happen are not recoverable -- a second try will always fail again in the same way. So usually it is best to give up and report the error to the user, rather than install complicated recovery logic. ...small snip... One important exception is `EINTR' ( Interrupted Primitives). Many stream I/O implementations will treat it as an ordinary error, which can be quite inconvenient. You can avoid this hassle by installing all signals with the `SA_RESTART' flag. > Does patch below help you? > --- syntax.c Wed Nov 28 17:17:37 2001 > +++ syntax.c-1.19+ Mon Dec 17 10:09:15 2001 > @@ -405,6 +405,8 @@ static int read_one_line (char **line, F > for (;;) { > c = fgetc (f); > if (c == EOF) { > + if (feof (f)) > + break; > if (errno == EINTR) > continue; > r = 0; I don't think so but either way we need some code up that can test it (EINTR), perhaps a timer? -- //Björnen
Attachment:
pgpcGuZM98XAe.pgp
Description: PGP signature