< prev index next >

src/java.base/share/classes/java/nio/MappedByteBuffer.java

Print this page

        

*** 75,96 **** // For mapped buffers, a FileDescriptor that may be used for mapping // operations if valid; null if the buffer is not mapped. private final FileDescriptor fd; // This should only be invoked by the DirectByteBuffer constructors // MappedByteBuffer(int mark, int pos, int lim, int cap, // package-private ! FileDescriptor fd) ! { super(mark, pos, lim, cap); this.fd = fd; } MappedByteBuffer(int mark, int pos, int lim, int cap) { // package-private super(mark, pos, lim, cap); this.fd = null; } // Returns the distance (in bytes) of the buffer from the page aligned address // of the mapping. Computed each time to avoid storing in every direct buffer. private long mappingOffset() { --- 75,111 ---- // For mapped buffers, a FileDescriptor that may be used for mapping // operations if valid; null if the buffer is not mapped. private final FileDescriptor fd; + // A flag true if this buffer is mapped against persistent memory + // using one of the persistent FileChannel.MapMode modes, + // MapMode.READ_ONLY_PERSISTENT or MapMode.READ_WRITE_PERSISTENT + // and false if it is mapped using any of other modes. this flag + // only determines the behaviour of force operations. + private final boolean isPersistent; + // This should only be invoked by the DirectByteBuffer constructors // MappedByteBuffer(int mark, int pos, int lim, int cap, // package-private ! FileDescriptor fd, boolean isPersistent) { super(mark, pos, lim, cap); this.fd = fd; + this.isPersistent = isPersistent; + } + + MappedByteBuffer(int mark, int pos, int lim, int cap, // package-private + boolean isPersistent) { + super(mark, pos, lim, cap); + this.fd = null; + this.isPersistent = isPersistent; } MappedByteBuffer(int mark, int pos, int lim, int cap) { // package-private super(mark, pos, lim, cap); this.fd = null; + this.isPersistent = false; } // Returns the distance (in bytes) of the buffer from the page aligned address // of the mapping. Computed each time to avoid storing in every direct buffer. private long mappingOffset() {
*** 106,115 **** --- 121,155 ---- private long mappingLength(long mappingOffset) { return (long)capacity() + mappingOffset; } /** + * Tells whether this buffer was mapped against a non-volatile + * memory device by passing one of the persistent map modes {@link + * java.nio.channels.FileChannel.MapMode#READ_ONLY_PERSISTENT + * MapMode#READ_ONLY_PERSISTENT} or {@link + * java.nio.channels.FileChannel.MapMode#READ_ONLY_PERSISTENT + * MapMode#READ_WRITE_PERSISTENT} in the call to {@link + * java.nio.channels.FileChannel#map FileChannel.map} or mapped + * against some other form of device file by pasing one of the + * other map modes. + * + * @return true if the file was mapped using against a + * non-volatile memory device by passing one of the persistent map + * modes {@link + * java.nio.channels.FileChannel.MapMode#READ_ONLY_PERSISTENT + * MapMode#READ_ONLY_PERSISTENT} or {@link + * java.nio.channels.FileChannel.MapMode#READ_ONLY_PERSISTENT + * MapMode#READ_WRITE_PERSISTENT} in the call to {@link + * java.nio.channels.FileChannel#map FileChannel.map} otherwise + * false. + */ + public boolean isPersistent() { + return isPersistent; + } + + /** * Tells whether or not this buffer's content is resident in physical * memory. * * <p> A return value of {@code true} implies that it is highly likely * that all of the data in this buffer is resident in physical memory and
*** 127,136 **** --- 167,180 ---- */ public final boolean isLoaded() { if (fd == null) { return true; } + // a persistent mapped buffer is always loaded + if (isPersistent()) { + return true; + } if ((address == 0) || (capacity() == 0)) return true; long offset = mappingOffset(); long length = mappingLength(offset); return isLoaded0(mappingAddress(offset), length, Bits.pageCount(length));
*** 151,160 **** --- 195,208 ---- */ public final MappedByteBuffer load() { if (fd == null) { return this; } + // no need to load a persistent mapped buffer + if (isPersistent()) { + return this; + } if ((address == 0) || (capacity() == 0)) return this; long offset = mappingOffset(); long length = mappingLength(offset); load0(mappingAddress(offset), length);
*** 200,215 **** * method has no effect. </p> * * @return This buffer */ public final MappedByteBuffer force() { if (fd == null) { return this; } if ((address != 0) && (capacity() != 0)) { long offset = mappingOffset(); ! force0(fd, mappingAddress(offset), mappingLength(offset)); } return this; } private native boolean isLoaded0(long address, long length, int pageCount); --- 248,312 ---- * method has no effect. </p> * * @return This buffer */ public final MappedByteBuffer force() { + return force(0, capacity()); + } + + /** + * Forces any changes made to some region of this buffer's content + * to be written to the storage device containing the mapped file. + * + * <p> If the file mapped into this buffer resides on a local storage + * device then when this method returns it is guaranteed that all changes + * made to the buffer since it was created, or since this method was last + * invoked, will have been written to that device. + * + * <p> If the file does not reside on a local device then no such guarantee + * is made. + * + * <p> If this buffer was not mapped in read/write mode ({@link + * java.nio.channels.FileChannel.MapMode#READ_WRITE}) then invoking this + * method has no effect. </p> + * + * @param from + * The offset to the first byte in the buffer region that + * is to be written back to storage + * + * @param to + * The offset to the first byte beyond the buffer region + * that is to be written back to storage + * + * @return This buffer + * + * @since 12 + */ + public final MappedByteBuffer force(long from, long to) { if (fd == null) { return this; } if ((address != 0) && (capacity() != 0)) { + // check inputs + if (from < 0 || from >= capacity()) { + throw new IllegalArgumentException(); + } + if (to < from || to > capacity()) { + throw new IllegalArgumentException(); + } + long offset = mappingOffset(); ! long a = mappingAddress(offset) + from; ! long length = to - from; ! if (isPersistent) { ! // simply force writeback of associated cache lines ! Unsafe unsafe = Unsafe.getUnsafe(); ! unsafe.writebackMemory(a, length); ! } else { ! // writeback using device associated with fd ! force0(fd, a, length); ! } } return this; } private native boolean isLoaded0(long address, long length, int pageCount);
< prev index next >