re PR libfortran/47439 (Fun with scratch files on Windows MKTEMP only allows for 26 files)
PR libfortran/47439 * io/unix.c (tempfile): Work around poor mktemp() implementations. * gfortran.dg/scratch_1.f90: New test. From-SVN: r171178
This commit is contained in:
parent
5bd4cd72af
commit
14bef49e53
@ -1,3 +1,8 @@
|
||||
2011-03-16 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
|
||||
|
||||
PR libfortran/47439
|
||||
* gfortran.dg/scratch_1.f90: New test.
|
||||
|
||||
2011-03-18 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc.dg/c1x-typedef-1.c: Expect errors for redefinitions of
|
||||
|
8
gcc/testsuite/gfortran.dg/scratch_1.f90
Normal file
8
gcc/testsuite/gfortran.dg/scratch_1.f90
Normal file
@ -0,0 +1,8 @@
|
||||
! { dg-do run }
|
||||
! Check that we can open more than 26 scratch files concurrently
|
||||
integer :: i
|
||||
do i = 1, 3000
|
||||
print *, i
|
||||
open(100+i,status="scratch")
|
||||
end do
|
||||
end
|
@ -1,3 +1,8 @@
|
||||
2011-03-19 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
|
||||
|
||||
PR libfortran/47439
|
||||
* io/unix.c (tempfile): Work around poor mktemp() implementations.
|
||||
|
||||
2011-03-16 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
|
||||
|
||||
PR libfortran/47883
|
||||
|
@ -1022,6 +1022,12 @@ tempfile (st_parameter_open *opp)
|
||||
char *template;
|
||||
const char *slash = "/";
|
||||
int fd;
|
||||
size_t tempdirlen;
|
||||
|
||||
#ifndef HAVE_MKSTEMP
|
||||
int count;
|
||||
size_t slashlen;
|
||||
#endif
|
||||
|
||||
tempdir = getenv ("GFORTRAN_TMPDIR");
|
||||
#ifdef __MINGW32__
|
||||
@ -1046,16 +1052,19 @@ tempfile (st_parameter_open *opp)
|
||||
if (tempdir == NULL)
|
||||
tempdir = DEFAULT_TEMPDIR;
|
||||
#endif
|
||||
|
||||
/* Check for special case that tempdir contains slash
|
||||
or backslash at end. */
|
||||
if (*tempdir == 0 || tempdir[strlen (tempdir) - 1] == '/'
|
||||
tempdirlen = strlen (tempdir);
|
||||
if (*tempdir == 0 || tempdir[tempdirlen - 1] == '/'
|
||||
#ifdef __MINGW32__
|
||||
|| tempdir[strlen (tempdir) - 1] == '\\'
|
||||
|| tempdir[tempdirlen - 1] == '\\'
|
||||
#endif
|
||||
)
|
||||
slash = "";
|
||||
|
||||
template = get_mem (strlen (tempdir) + 20);
|
||||
// Take care that the template is longer in the mktemp() branch.
|
||||
template = get_mem (tempdirlen + 23);
|
||||
|
||||
#ifdef HAVE_MKSTEMP
|
||||
sprintf (template, "%s%sgfortrantmpXXXXXX", tempdir, slash);
|
||||
@ -1064,11 +1073,30 @@ tempfile (st_parameter_open *opp)
|
||||
|
||||
#else /* HAVE_MKSTEMP */
|
||||
fd = -1;
|
||||
count = 0;
|
||||
slashlen = strlen (slash);
|
||||
do
|
||||
{
|
||||
sprintf (template, "%s%sgfortrantmpXXXXXX", tempdir, slash);
|
||||
sprintf (template, "%s%sgfortrantmpaaaXXXXXX", tempdir, slash);
|
||||
if (count > 0)
|
||||
{
|
||||
int c = count;
|
||||
template[tempdirlen + slashlen + 13] = 'a' + (c% 26);
|
||||
c /= 26;
|
||||
template[tempdirlen + slashlen + 12] = 'a' + (c % 26);
|
||||
c /= 26;
|
||||
template[tempdirlen + slashlen + 11] = 'a' + (c % 26);
|
||||
if (c >= 26)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!mktemp (template))
|
||||
break;
|
||||
{
|
||||
errno = EEXIST;
|
||||
count++;
|
||||
continue;
|
||||
}
|
||||
|
||||
#if defined(HAVE_CRLF) && defined(O_BINARY)
|
||||
fd = open (template, O_RDWR | O_CREAT | O_EXCL | O_BINARY,
|
||||
S_IREAD | S_IWRITE);
|
||||
|
Loading…
Reference in New Issue
Block a user