--- old/src/java.base/share/classes/sun/nio/ch/IOUtil.java 2016-09-29 14:26:26.410927321 -0700 +++ new/src/java.base/share/classes/sun/nio/ch/IOUtil.java 2016-09-29 14:26:26.295927320 -0700 @@ -29,6 +29,11 @@ import java.io.IOException; import java.nio.ByteBuffer; +import jdk.internal.misc.JavaIOFileDescriptorAccess; +import jdk.internal.misc.JavaNioAccess; +import jdk.internal.misc.SharedSecrets; +import jdk.internal.ref.Cleaner; +import sun.security.action.GetPropertyAction; /** * File-descriptor based I/O utilities that are shared by NIO classes. @@ -41,6 +46,9 @@ */ static final int IOV_MAX; + private static final JavaIOFileDescriptorAccess fdAccess = + SharedSecrets.getJavaIOFileDescriptorAccess(); + private IOUtil() { } // No instantiation static int write(FileDescriptor fd, ByteBuffer src, long position, @@ -86,11 +94,19 @@ if (rem == 0) return 0; if (position != -1) { - written = nd.pwrite(fd, - ((DirectBuffer)bb).address() + pos, - rem, position); + if (fdAccess.getDirect(fd)) + written = nd.pwriteDirect(fd, + ((DirectBuffer)bb).address() + pos, + rem, position); + else + written = nd.pwrite(fd, + ((DirectBuffer)bb).address() + pos, + rem, position); } else { - written = nd.write(fd, ((DirectBuffer)bb).address() + pos, rem); + if (fdAccess.getDirect(fd)) + written = nd.writeDirect(fd, ((DirectBuffer)bb).address() + pos, rem); + else + written = nd.write(fd, ((DirectBuffer)bb).address() + pos, rem); } if (written > 0) bb.position(pos + written); @@ -145,7 +161,11 @@ if (iov_len == 0) return 0L; - long bytesWritten = nd.writev(fd, vec.address, iov_len); + long bytesWritten; + if (fdAccess.getDirect(fd)) + bytesWritten = nd.writevDirect(fd, vec.address, iov_len); + else + bytesWritten = nd.writev(fd, vec.address, iov_len); // Notify the buffers how many bytes were taken long left = bytesWritten; @@ -217,10 +237,17 @@ return 0; int n = 0; if (position != -1) { - n = nd.pread(fd, ((DirectBuffer)bb).address() + pos, - rem, position); + if (fdAccess.getDirect(fd)) + n = nd.preadDirect(fd, ((DirectBuffer)bb).address() + pos, + rem, position); + else + n = nd.pread(fd, ((DirectBuffer)bb).address() + pos, + rem, position); } else { - n = nd.read(fd, ((DirectBuffer)bb).address() + pos, rem); + if (fdAccess.getDirect(fd)) + n = nd.readDirect(fd, ((DirectBuffer)bb).address() + pos, rem); + else + n = nd.read(fd, ((DirectBuffer)bb).address() + pos, rem); } if (n > 0) bb.position(pos + n); @@ -274,8 +301,11 @@ } if (iov_len == 0) return 0L; - - long bytesRead = nd.readv(fd, vec.address, iov_len); + long bytesRead; + if (fdAccess.getDirect(fd)) + bytesRead = nd.readvDirect(fd, vec.address, iov_len); + else + bytesRead = nd.readv(fd, vec.address, iov_len); // Notify the buffers how many bytes were read long left = bytesRead;