jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java
changeset 38445 0a88d86065f9
parent 37781 71ed5645f17c
child 42447 36db92901ae9
--- 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);
         }
     }