< prev index next >

src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java

Print this page

        

*** 945,960 **** throw new IllegalArgumentException("Position + size overflow"); if (size > Integer.MAX_VALUE) throw new IllegalArgumentException("Size exceeds Integer.MAX_VALUE"); int imode = -1; if (mode == MapMode.READ_ONLY) imode = MAP_RO; else if (mode == MapMode.READ_WRITE) imode = MAP_RW; ! else if (mode == MapMode.PRIVATE) imode = MAP_PV; assert (imode >= 0); if ((mode != MapMode.READ_ONLY) && !writable) throw new NonWritableChannelException(); if (!readable) throw new NonReadableChannelException(); --- 945,969 ---- throw new IllegalArgumentException("Position + size overflow"); if (size > Integer.MAX_VALUE) throw new IllegalArgumentException("Size exceeds Integer.MAX_VALUE"); int imode = -1; + boolean isPersistent = false; if (mode == MapMode.READ_ONLY) imode = MAP_RO; else if (mode == MapMode.READ_WRITE) imode = MAP_RW; ! else if (mode == MapMode.PRIVATE) { imode = MAP_PV; + } else if (mode == MapMode.READ_ONLY_PERSISTENT) { + imode = MAP_RO; + isPersistent = true; + } else if (mode == MapMode.READ_WRITE_PERSISTENT) { + imode = MAP_RW; + isPersistent = true; + } + assert (imode >= 0); if ((mode != MapMode.READ_ONLY) && !writable) throw new NonWritableChannelException(); if (!readable) throw new NonReadableChannelException();
*** 993,1024 **** if (size == 0) { addr = 0; // a valid file descriptor is not required FileDescriptor dummy = new FileDescriptor(); if ((!writable) || (imode == MAP_RO)) ! return Util.newMappedByteBufferR(0, 0, dummy, null); else ! return Util.newMappedByteBuffer(0, 0, dummy, null); } pagePosition = (int)(position % allocationGranularity); long mapPosition = position - pagePosition; mapSize = size + pagePosition; try { // If map0 did not throw an exception, the address is valid ! addr = map0(imode, mapPosition, mapSize); } catch (OutOfMemoryError x) { // An OutOfMemoryError may indicate that we've exhausted // memory so force gc and re-attempt map System.gc(); try { Thread.sleep(100); } catch (InterruptedException y) { Thread.currentThread().interrupt(); } try { ! addr = map0(imode, mapPosition, mapSize); } catch (OutOfMemoryError y) { // After a second OOME, fail throw new IOException("Map failed", y); } } --- 1002,1033 ---- if (size == 0) { addr = 0; // a valid file descriptor is not required FileDescriptor dummy = new FileDescriptor(); if ((!writable) || (imode == MAP_RO)) ! return Util.newMappedByteBufferR(0, 0, dummy, null, isPersistent); else ! return Util.newMappedByteBuffer(0, 0, dummy, null, isPersistent); } pagePosition = (int)(position % allocationGranularity); long mapPosition = position - pagePosition; mapSize = size + pagePosition; try { // If map0 did not throw an exception, the address is valid ! addr = map0(imode, mapPosition, mapSize, isPersistent); } catch (OutOfMemoryError x) { // An OutOfMemoryError may indicate that we've exhausted // memory so force gc and re-attempt map System.gc(); try { Thread.sleep(100); } catch (InterruptedException y) { Thread.currentThread().interrupt(); } try { ! addr = map0(imode, mapPosition, mapSize, isPersistent); } catch (OutOfMemoryError y) { // After a second OOME, fail throw new IOException("Map failed", y); } }
*** 1040,1055 **** Unmapper um = new Unmapper(addr, mapSize, isize, mfd); if ((!writable) || (imode == MAP_RO)) { return Util.newMappedByteBufferR(isize, addr + pagePosition, mfd, ! um); } else { return Util.newMappedByteBuffer(isize, addr + pagePosition, mfd, ! um); } } finally { threads.remove(ti); endBlocking(IOStatus.checkAll(addr)); } --- 1049,1066 ---- Unmapper um = new Unmapper(addr, mapSize, isize, mfd); if ((!writable) || (imode == MAP_RO)) { return Util.newMappedByteBufferR(isize, addr + pagePosition, mfd, ! um, ! isPersistent); } else { return Util.newMappedByteBuffer(isize, addr + pagePosition, mfd, ! um, ! isPersistent); } } finally { threads.remove(ti); endBlocking(IOStatus.checkAll(addr)); }
*** 1199,1209 **** } // -- Native methods -- // Creates a new mapping ! private native long map0(int prot, long position, long length) throws IOException; // Removes an existing mapping private static native int unmap0(long address, long length); --- 1210,1220 ---- } // -- Native methods -- // Creates a new mapping ! private native long map0(int prot, long position, long length, boolean isPersistent) throws IOException; // Removes an existing mapping private static native int unmap0(long address, long length);
< prev index next >