aboutsummaryrefslogtreecommitdiff
path: root/libjava/java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/io/File.java4
-rw-r--r--libjava/java/io/natFileDescriptorPosix.cc8
2 files changed, 11 insertions, 1 deletions
diff --git a/libjava/java/io/File.java b/libjava/java/io/File.java
index 38bcb9f..c8aaddf 100644
--- a/libjava/java/io/File.java
+++ b/libjava/java/io/File.java
@@ -260,7 +260,9 @@ public class File implements Serializable
String l = prefix + t.substring(t.length() - 6) + suffix;
try
{
- desc.open (l, FileDescriptor.WRITE | FileDescriptor.EXCL);
+ desc = new FileDescriptor
+ (l, FileDescriptor.WRITE | FileDescriptor.EXCL);
+ desc.close ();
ret.setPath(l);
return ret;
}
diff --git a/libjava/java/io/natFileDescriptorPosix.cc b/libjava/java/io/natFileDescriptorPosix.cc
index 50be35c..6e06a03 100644
--- a/libjava/java/io/natFileDescriptorPosix.cc
+++ b/libjava/java/io/natFileDescriptorPosix.cc
@@ -43,6 +43,7 @@ details. */
#include <java/io/EOFException.h>
#include <java/lang/ArrayIndexOutOfBoundsException.h>
#include <java/lang/NullPointerException.h>
+#include <java/lang/System.h>
#include <java/lang/String.h>
#include <java/lang/Thread.h>
#include <java/io/FileNotFoundException.h>
@@ -105,6 +106,13 @@ java::io::FileDescriptor::open (jstring path, jint jflags)
}
int fd = ::open (buf, flags, mode);
+ if (fd == -1 && errno == EMFILE)
+ {
+ // Because finalize () calls close () we might be able to continue.
+ java::lang::System::gc ();
+ java::lang::System::runFinalization ();
+ fd = ::open (buf, flags, mode);
+ }
if (fd == -1)
{
char msg[MAXPATHLEN + 200];