< prev index next >
src/java.base/share/classes/sun/nio/ch/IOUtil.java
Print this page
*** 27,36 ****
--- 27,41 ----
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,48 ****
--- 44,56 ----
/**
* 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,97 ****
--- 92,113 ----
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,153 ****
i++;
}
if (iov_len == 0)
return 0L;
! long 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) {
--- 159,173 ----
i++;
}
if (iov_len == 0)
return 0L;
! 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,227 ****
--- 235,254 ----
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,283 ****
}
i++;
}
if (iov_len == 0)
return 0L;
!
! long 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);
--- 299,313 ----
}
i++;
}
if (iov_len == 0)
return 0L;
! 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 >