--- a/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java Fri May 20 14:07:21 2016 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java Fri May 20 11:41:29 2016 -0300
@@ -40,7 +40,6 @@
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.SelectableChannel;
import java.nio.channels.WritableByteChannel;
-import java.security.AccessController;
import java.util.ArrayList;
import java.util.List;
@@ -83,6 +82,9 @@
// Lock for operations involving position and size
private final Object positionLock = new Object();
+ // Positional-read is not interruptible
+ private volatile boolean uninterruptible;
+
private FileChannelImpl(FileDescriptor fd, String path, boolean readable,
boolean writable, Object parent)
{
@@ -108,6 +110,10 @@
throw new ClosedChannelException();
}
+ public void setUninterruptible() {
+ uninterruptible = true;
+ }
+
// -- Standard channel operations --
protected void implCloseChannel() throws IOException {
@@ -733,8 +739,10 @@
assert !nd.needsPositionLock() || Thread.holdsLock(positionLock);
int n = 0;
int ti = -1;
+
+ boolean interruptible = !uninterruptible;
try {
- begin();
+ if (interruptible) begin();
ti = threads.add();
if (!isOpen())
return -1;
@@ -744,7 +752,7 @@
return IOStatus.normalize(n);
} finally {
threads.remove(ti);
- end(n > 0);
+ if (interruptible) end(n > 0);
assert IOStatus.check(n);
}
}