From: Gerd Moellmann Date: Wed, 15 Nov 2000 12:34:58 +0000 (+0000) Subject: (directory_files_internal) [EAGAIN || EINTR]: Retry X-Git-Tag: emacs-pretest-21.0.90~59 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=8e42f043315b3f86491a569caa54c0365954e475;p=emacs.git (directory_files_internal) [EAGAIN || EINTR]: Retry reading the directory if readdir returns null and errno is EAGAIN or EINTR. --- diff --git a/src/ChangeLog b/src/ChangeLog index 4ba3ced9541..76d96f7bb39 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2000-11-15 Gerd Moellmann + + * dired.c (directory_files_internal) [EAGAIN || EINTR]: Retry + reading the directory if readdir returns null and errno is EAGAIN + or EINTR. + 2000-11-14 Stefan Monnier * xdisp.c (try_scrolling): Set scroll_max to max of scroll_* args diff --git a/src/dired.c b/src/dired.c index 9fd9bffc4f1..bcfe8ddd820 100644 --- a/src/dired.c +++ b/src/dired.c @@ -144,6 +144,8 @@ directory_files_internal (directory, full, match, nosort, attrs) int needsep = 0; int count = specpdl_ptr - specpdl; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; + DIRENTRY *dp; + int retry_p; /* Because of file name handlers, these functions might call Ffuncall, and cause a GC. */ @@ -182,6 +184,8 @@ directory_files_internal (directory, full, match, nosort, attrs) an error is signaled while the directory stream is open, we have to make sure it gets closed, and setting up an unwind_protect to do so would be a pain. */ + retry: + d = opendir (XSTRING (dirfilename)->data); if (d == NULL) report_file_error ("Opening directory", Fcons (directory, Qnil)); @@ -203,14 +207,9 @@ directory_files_internal (directory, full, match, nosort, attrs) needsep = 1; #endif /* not VMS */ - /* Loop reading blocks */ - while (1) + /* Loop reading blocks until EOF or error. */ + while ((dp = readdir (d)) != NULL) { - DIRENTRY *dp = readdir (d); - - if (dp == NULL) - break; - if (DIRENTRY_NONEMPTY (dp)) { int len; @@ -295,11 +294,22 @@ directory_files_internal (directory, full, match, nosort, attrs) } } + retry_p = 0; +#ifdef EAGAIN + retry_p |= errno == EAGAIN; +#endif +#ifdef EINTR + retry_p |= errno == EINTR; +#endif + closedir (d); /* Discard the unwind protect. */ specpdl_ptr = specpdl + count; + if (retry_p) + goto retry; + if (NILP (nosort)) list = Fsort (Fnreverse (list), attrs ? Qfile_attributes_lessp : Qstring_lessp);