1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

Run the GC and retry open-file' when getting EMFILE'.

* libguile/fports.c (scm_open_file): Run the GC and retry when getting
  `EMFILE'.
This commit is contained in:
Ludovic Courtès 2009-11-15 16:55:57 +01:00
parent 4c7b997519
commit 64e3a89c35

View file

@ -318,11 +318,9 @@ SCM_DEFINE (scm_open_file, "open-file", 2, 0, 0,
#define FUNC_NAME s_scm_open_file #define FUNC_NAME s_scm_open_file
{ {
SCM port; SCM port;
int fdes; int fdes, flags = 0;
int flags = 0; unsigned int retries;
char *file; char *file, *md, *ptr;
char *md;
char *ptr;
scm_dynwind_begin (0); scm_dynwind_begin (0);
@ -367,15 +365,27 @@ SCM_DEFINE (scm_open_file, "open-file", 2, 0, 0,
} }
ptr++; ptr++;
} }
SCM_SYSCALL (fdes = open_or_open64 (file, flags, 0666));
if (fdes == -1)
{
int en = errno;
SCM_SYSERROR_MSG ("~A: ~S", for (retries = 0, fdes = -1;
scm_cons (scm_strerror (scm_from_int (en)), fdes < 0 && retries < 2;
scm_cons (filename, SCM_EOL)), en); retries++)
{
SCM_SYSCALL (fdes = open_or_open64 (file, flags, 0666));
if (fdes == -1)
{
int en = errno;
if (en == EMFILE && retries == 0)
/* Run the GC in case it collects open file ports that are no
longer referenced. */
scm_i_gc (FUNC_NAME);
else
SCM_SYSERROR_MSG ("~A: ~S",
scm_cons (scm_strerror (scm_from_int (en)),
scm_cons (filename, SCM_EOL)), en);
}
} }
port = scm_i_fdes_to_port (fdes, scm_i_mode_bits (mode), filename); port = scm_i_fdes_to_port (fdes, scm_i_mode_bits (mode), filename);
scm_dynwind_end (); scm_dynwind_end ();