< prev index next >

src/java.base/share/classes/java/io/RandomAccessFile.java

Print this page
@@ -69,10 +69,11 @@
      private static final int O_TEMPORARY =  16;
  
      private final FileDescriptor fd;
  
      private final boolean rw;
+     private final boolean sync;  // O_SYNC or O_DSYNC
  
      /**
       * The path of the referenced file
       * (null if the stream is created with a file descriptor)
       */

@@ -227,25 +228,29 @@
      {
          String name = (file != null ? file.getPath() : null);
          int imode = -1;
  
          boolean rw = false;
+         boolean sync = false;
          if (mode.equals("r"))
              imode = O_RDONLY;
          else if (mode.startsWith("rw")) {
              imode = O_RDWR;
              rw = true;
              if (mode.length() > 2) {
-                 if (mode.equals("rws"))
+                 if (mode.equals("rws")) {
                      imode |= O_SYNC;
-                 else if (mode.equals("rwd"))
+                     sync = true;
+                 } else if (mode.equals("rwd")) {
                      imode |= O_DSYNC;
-                 else
+                     sync = true;
+                 } else
                      imode = -1;
              }
          }
          this.rw = rw;
+         this.sync = sync;
  
          if (openAndDelete)
              imode |= O_TEMPORARY;
          if (imode < 0)
              throw new IllegalArgumentException("Illegal mode \"" + mode

@@ -306,12 +311,12 @@
          FileChannel fc = this.channel;
          if (fc == null) {
              synchronized (this) {
                  fc = this.channel;
                  if (fc == null) {
-                     this.channel = fc = FileChannelImpl.open(fd, path, true,
-                         rw, false, this);
+                     fc = FileChannelImpl.open(fd, path, true, rw, sync, false, this);
+                     this.channel = fc;
                      if (closed) {
                          try {
                              fc.close();
                          } catch (IOException ioe) {
                              throw new InternalError(ioe); // should not happen

@@ -348,16 +353,11 @@
       * @param name the name of the file
       * @param mode the mode flags, a combination of the O_ constants
       *             defined above
       */
      private void open(String name, int mode) throws FileNotFoundException {
-         long comp = Blocker.begin();
-         try {
-             open0(name, mode);
-         } finally {
-             Blocker.end(comp);
-         }
+         open0(name, mode);
      }
  
      // 'Read' primitives
  
      /**

@@ -374,16 +374,11 @@
       *             file has been reached.
       * @throws     IOException  if an I/O error occurs. Not thrown if
       *                          end-of-file has been reached.
       */
      public int read() throws IOException {
-         long comp = Blocker.begin();
-         try {
-             return read0();
-         } finally {
-             Blocker.end(comp);
-         }
+         return read0();
      }
  
      private native int read0() throws IOException;
  
      /**

@@ -392,16 +387,11 @@
       * @param     off the start offset of the data.
       * @param     len the number of bytes to read.
       * @throws    IOException If an I/O error has occurred.
       */
      private int readBytes(byte[] b, int off, int len) throws IOException {
-         long comp = Blocker.begin();
-         try {
-             return readBytes0(b, off, len);
-         } finally {
-             Blocker.end(comp);
-         }
+         return readBytes0(b, off, len);
      }
  
      private native int readBytes0(byte[] b, int off, int len) throws IOException;
  
      /**

@@ -545,15 +535,15 @@
       *
       * @param      b   the {@code byte} to be written.
       * @throws     IOException  if an I/O error occurs.
       */
      public void write(int b) throws IOException {
-         long comp = Blocker.begin();
+         boolean attempted = Blocker.begin(sync);
          try {
              write0(b);
          } finally {
-             Blocker.end(comp);
+             Blocker.end(attempted);
          }
      }
  
      private native void write0(int b) throws IOException;
  

@@ -564,15 +554,15 @@
       * @param     off the start offset in the data
       * @param     len the number of bytes that are written
       * @throws    IOException If an I/O error has occurred.
       */
      private void writeBytes(byte[] b, int off, int len) throws IOException {
-         long comp = Blocker.begin();
+         boolean attempted = Blocker.begin(sync);
          try {
              writeBytes0(b, off, len);
          } finally {
-             Blocker.end(comp);
+             Blocker.end(attempted);
          }
      }
  
      private native void writeBytes0(byte[] b, int off, int len) throws IOException;
  

@@ -628,16 +618,11 @@
       */
      public void seek(long pos) throws IOException {
          if (pos < 0) {
              throw new IOException("Negative seek offset");
          }
-         long comp = Blocker.begin();
-         try {
-             seek0(pos);
-         } finally {
-             Blocker.end(comp);
-         }
+         seek0(pos);
      }
  
      private native void seek0(long pos) throws IOException;
  
      /**

@@ -645,16 +630,11 @@
       *
       * @return     the length of this file, measured in bytes.
       * @throws     IOException  if an I/O error occurs.
       */
      public long length() throws IOException {
-         long comp = Blocker.begin();
-         try {
-             return length0();
-         } finally {
-             Blocker.end(comp);
-         }
+         return length0();
      }
  
      private native long length0() throws IOException;
  
      /**

@@ -682,16 +662,11 @@
       * @throws     IOException  If the argument is negative or
       *                          if some other I/O error occurs
       * @since      1.2
       */
      public void setLength(long newLength) throws IOException {
-         long comp = Blocker.begin();
-         try {
-             setLength0(newLength);
-         } finally {
-             Blocker.end(comp);
-         }
+         setLength0(newLength);
      }
  
      private native void setLength0(long newLength) throws IOException;
  
      /**
< prev index next >