< 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 >