Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjfrijters <jfrijters>2011-08-19 13:24:19 +0400
committerjfrijters <jfrijters>2011-08-19 13:24:19 +0400
commit4f49b8f6792a37b1c005a0e9b5fcc1879aa57d90 (patch)
treefd9853e54e94a7e703dcc83a6d1da358c2cce3e8 /openjdk/sun
parent883965d3543fe43ab960a7010188cd940e0bce9f (diff)
Fixed several append issues:
- FileChannelImpl.truncate() should not attempt to seek (would throw an exception) - FileDispatcherImpl.write() doesn't need to seek to EOF - FileDispatcherImpl.truncate() can't use fd.setLength() to truncate on append FileStream, so we open the file again to truncate it - NetFileSystemProvider.newFileChannel() should not set FileSystemRights.Write in append mode
Diffstat (limited to 'openjdk/sun')
-rw-r--r--openjdk/sun/nio/ch/FileChannelImpl.java4
-rw-r--r--openjdk/sun/nio/ch/FileDispatcherImpl.java12
-rw-r--r--openjdk/sun/nio/fs/NetFileSystemProvider.java25
3 files changed, 31 insertions, 10 deletions
diff --git a/openjdk/sun/nio/ch/FileChannelImpl.java b/openjdk/sun/nio/ch/FileChannelImpl.java
index 86049d69..160e1f54 100644
--- a/openjdk/sun/nio/ch/FileChannelImpl.java
+++ b/openjdk/sun/nio/ch/FileChannelImpl.java
@@ -343,6 +343,10 @@ public class FileChannelImpl
if (!isOpen())
return null;
+ // [IKVM] in append mode we're not allowed to seek backwards, but the atomic append will honor the new file size
+ if (append)
+ return this;
+
// set position to size if greater than size
if (p > size)
p = size;
diff --git a/openjdk/sun/nio/ch/FileDispatcherImpl.java b/openjdk/sun/nio/ch/FileDispatcherImpl.java
index e8d4a55b..9d836dfd 100644
--- a/openjdk/sun/nio/ch/FileDispatcherImpl.java
+++ b/openjdk/sun/nio/ch/FileDispatcherImpl.java
@@ -56,9 +56,6 @@ class FileDispatcherImpl extends FileDispatcher
}
int write(FileDescriptor fd, byte[] buf, int offset, int length) throws IOException {
- if (append) {
- fd.seek(fd.length());
- }
fd.writeBytes(buf, offset, length);
return length;
}
@@ -129,7 +126,14 @@ class FileDispatcherImpl extends FileDispatcher
}
int truncate(FileDescriptor fd, long size) throws IOException {
- fd.setLength(size);
+ if (append) {
+ // HACK in append mode we're not allowed to truncate, so we try to reopen the file and truncate that
+ try (FileOutputStream fos = new FileOutputStream(((FileStream)fd.getStream()).get_Name())) {
+ fos.getFD().setLength(size);
+ }
+ } else {
+ fd.setLength(size);
+ }
return 0;
}
diff --git a/openjdk/sun/nio/fs/NetFileSystemProvider.java b/openjdk/sun/nio/fs/NetFileSystemProvider.java
index 19ee8fc7..0188273a 100644
--- a/openjdk/sun/nio/fs/NetFileSystemProvider.java
+++ b/openjdk/sun/nio/fs/NetFileSystemProvider.java
@@ -80,7 +80,6 @@ final class NetFileSystemProvider extends AbstractFileSystemProvider
throw new NotYetImplementedError();
}
int mode = FileMode.Open;
- int rights = 0;
int share = FileShare.ReadWrite | FileShare.Delete;
int options = FileOptions.None;
boolean read = false;
@@ -97,7 +96,6 @@ final class NetFileSystemProvider extends AbstractFileSystemProvider
append = true;
write = true;
mode = FileMode.Append;
- rights |= FileSystemRights.AppendData;
break;
case CREATE:
mode = FileMode.Create;
@@ -113,7 +111,6 @@ final class NetFileSystemProvider extends AbstractFileSystemProvider
break;
case READ:
read = true;
- rights |= FileSystemRights.Read;
break;
case SPARSE:
sparse = true;
@@ -126,7 +123,6 @@ final class NetFileSystemProvider extends AbstractFileSystemProvider
break;
case WRITE:
write = true;
- rights |= FileSystemRights.Write;
break;
default:
throw new UnsupportedOperationException();
@@ -162,7 +158,6 @@ final class NetFileSystemProvider extends AbstractFileSystemProvider
if (!read && !write)
{
read = true;
- rights |= FileSystemRights.Read;
}
if (read && append)
@@ -179,7 +174,25 @@ final class NetFileSystemProvider extends AbstractFileSystemProvider
{
throw new UnsupportedOperationException();
}
-
+
+ int rights = 0;
+ if (append)
+ {
+ // for atomic append to work, we can't set FileSystemRights.Write
+ rights |= FileSystemRights.AppendData;
+ }
+ else
+ {
+ if (read)
+ {
+ rights |= FileSystemRights.Read;
+ }
+ if (write)
+ {
+ rights |= FileSystemRights.Write;
+ }
+ }
+
FileStream fs;
try
{