blob: e995f67aa5e4e7d8cc7353eaa2cdc6cf26d7d11e [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.nio;
import org.apache.harmony.luni.platform.IMemorySystem;
import org.apache.harmony.luni.platform.MappedPlatformAddress;
import org.apache.harmony.luni.platform.PlatformAddress;
import org.apache.harmony.nio.internal.DirectBuffer;
/**
* {@code MappedByteBuffer} is a special kind of direct byte buffer which maps a
* region of file to memory.
* <p>
* {@code MappedByteBuffer} can be created by calling
* {@link java.nio.channels.FileChannel#map(java.nio.channels.FileChannel.MapMode, long, long) FileChannel.map}.
* Once created, the mapping between the byte buffer and the file region remains
* valid until the byte buffer is garbage collected.
* <p>
* All or part of a {@code MappedByteBuffer}'s content may change or become
* inaccessible at any time, since the mapped file region can be modified by
* another thread or process at any time. If this happens, the behavior of the
* {@code MappedByteBuffer} is undefined.
*/
public abstract class MappedByteBuffer extends ByteBuffer {
final DirectByteBuffer wrapped;
private int mapMode;
MappedByteBuffer(ByteBuffer directBuffer) {
super(directBuffer.capacity);
if (!directBuffer.isDirect()) {
throw new IllegalArgumentException();
}
this.wrapped = (DirectByteBuffer) directBuffer;
}
MappedByteBuffer(PlatformAddress addr, int capa, int offset, int mode) {
super(capa);
mapMode = mode;
switch (mapMode) {
case IMemorySystem.MMAP_READ_ONLY:
wrapped = new ReadOnlyDirectByteBuffer(addr, capa, offset);
break;
case IMemorySystem.MMAP_READ_WRITE:
case IMemorySystem.MMAP_WRITE_COPY:
wrapped = new ReadWriteDirectByteBuffer(addr, capa, offset);
break;
default:
throw new IllegalArgumentException();
}
addr.autoFree();
}
/**
* Indicates whether this buffer's content is loaded. If the result is true
* there is a high probability that the whole buffer memory is currently
* loaded in RAM. If it is false it is unsure if it is loaded or not.
*
* @return {@code true} if this buffer's content is loaded, {@code false}
* otherwise.
*/
public final boolean isLoaded() {
return ((MappedPlatformAddress) ((DirectBuffer) wrapped)
.getBaseAddress()).mmapIsLoaded();
}
/**
* Loads this buffer's content into memory but it is not guaranteed to
* succeed.
*
* @return this buffer.
*/
public final MappedByteBuffer load() {
((MappedPlatformAddress) ((DirectBuffer) wrapped).getBaseAddress())
.mmapLoad();
return this;
}
/**
* Writes all changes of the buffer to the mapped file. If the mapped file
* is stored on a local device, it is guaranteed that the changes are
* written to the file. No such guarantee is given if the file is located on
* a remote device.
*
* @return this buffer.
*/
public final MappedByteBuffer force() {
if (mapMode == IMemorySystem.MMAP_READ_WRITE) {
((MappedPlatformAddress) ((DirectBuffer) wrapped).getBaseAddress())
.mmapFlush();
}
return this;
}
}