< prev index next >
src/java.base/share/classes/sun/nio/ch/IOUtil.java
Print this page
@@ -27,10 +27,15 @@
import java.io.FileDescriptor;
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.
*/
@@ -39,10 +44,13 @@
/**
* Max number of iovec structures that readv/writev supports
*/
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,
NativeDispatcher nd)
throws IOException
@@ -84,14 +92,22 @@
int written = 0;
if (rem == 0)
return 0;
if (position != -1) {
+ 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 {
+ 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);
return written;
@@ -143,11 +159,15 @@
i++;
}
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;
for (int j=0; j<iov_len; j++) {
if (left > 0) {
@@ -215,13 +235,20 @@
if (rem == 0)
return 0;
int n = 0;
if (position != -1) {
+ 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 {
+ 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);
return n;
@@ -272,12 +299,15 @@
}
i++;
}
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;
for (int j=0; j<iov_len; j++) {
ByteBuffer shadow = vec.getShadow(j);
< prev index next >