DirectByteBuffer.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.PlatformAddress; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.PlatformAddressFactory; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.nio.internal.DirectBuffer; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.nio.internal.nls.Messages; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DirectByteBuffer, ReadWriteDirectByteBuffer and ReadOnlyDirectByteBuffer 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * compose the implementation of platform memory based byte buffers. 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DirectByteBuffer implements all the shared readonly methods and is extended 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by the other two classes. 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * All methods are marked final for runtime performance. 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectabstract class DirectByteBuffer extends BaseByteBuffer implements DirectBuffer { 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // This class will help us track whether the address is valid or not. 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final class SafeAddress { 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected volatile boolean isValid = true; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected final PlatformAddress address; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected SafeAddress(PlatformAddress address) { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.address = address; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // This is a wrapped reference to the base address of the buffer memory. 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected final SafeAddress safeAddress; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // This is the offset from the base address at which this buffer logically 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // starts. 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected final int offset; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new direct byte buffer of the given capacity on newly 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * allocated OS memory. The memory will have been zeroed. When the 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instance is discarded the OS memory will be freed if it has not 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * already been done so by an explicit call to #free(). Callers are 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * encouraged to explicitly free the memory where possible. 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DirectByteBuffer(int capacity) { 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(new SafeAddress(PlatformAddressFactory.alloc(capacity, (byte)0)), capacity, 0); 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project safeAddress.address.autoFree(); 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DirectByteBuffer(SafeAddress address, int capacity, int offset) { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(capacity); 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project PlatformAddress baseAddress = address.address; 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long baseSize = baseAddress.getSize(); 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((baseSize >= 0) && ((offset + capacity) > baseSize)) { 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException("slice out of range"); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.safeAddress = address; 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.offset = offset; 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Override ByteBuffer.get(byte[], int, int) to improve performance. 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (non-Javadoc) 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.nio.ByteBuffer#get(byte[], int, int) 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final ByteBuffer get(byte[] dest, int off, int len) { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int length = dest.length; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((off < 0 ) || (len < 0) || (long)off + (long)len > length) { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (len > remaining()) { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getBaseAddress().getByteArray(offset+position, dest, off, len); 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position += len; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final byte get() { 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (position == limit) { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getBaseAddress().getByte(offset + position++); 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final byte get(int index) { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < 0 || index >= limit) { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getBaseAddress().getByte(offset + index); 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final double getDouble() { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int newPosition = position + 8; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project double result = getBaseAddress().getDouble(offset + position, order); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final double getDouble(int index) { 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < 0 || (long)index + 8 > limit) { 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getBaseAddress().getDouble(offset + index, order); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final float getFloat() { 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int newPosition = position + 4; 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project float result = getBaseAddress().getFloat(offset + position, order); 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final float getFloat(int index) { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < 0 || (long)index + 4 > limit) { 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getBaseAddress().getFloat(offset + index, order); 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int getInt() { 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int newPosition = position + 4; 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int result = getBaseAddress().getInt(offset + position, order); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int getInt(int index) { 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < 0 || (long)index + 4 > limit) { 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getBaseAddress().getInt(offset + index, order); 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final long getLong() { 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int newPosition = position + 8; 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long result = getBaseAddress().getLong(offset + position, order); 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final long getLong(int index) { 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < 0 || (long)index + 8 > limit) { 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getBaseAddress().getLong(offset + index, order); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final short getShort() { 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int newPosition = position + 2; 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project short result = getBaseAddress().getShort(offset + position, order); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final short getShort(int index) { 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < 0 || (long)index + 2 > limit) { 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getBaseAddress().getShort(offset + index, order); 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final boolean isDirect() { 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final boolean isAddressValid() { 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return safeAddress.isValid; 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void addressValidityCheck() { 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isAddressValid()) { 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // nio.08=Cannot use the direct byte buffer after it has been explicitly freed. 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException( 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Messages.getString("nio.08")); //$NON-NLS-1$ 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void markAddressInvalid() { 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project safeAddress.isValid = false; 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the base address of the buffer (i.e. before offset). 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final PlatformAddress getBaseAddress() { 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project addressValidityCheck(); 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return safeAddress.address; 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the platform address of the start of this buffer instance. 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>You must not attempt to free the returned address!!</em> It may not 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be an address that was explicitly malloc'ed (i.e. if this buffer is the 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * result of a split); and it may be memory shared by multiple buffers. 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If you can guarantee that you want to free the underlying memory call the 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * #free() method on this instance -- generally applications will rely on 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the garbage collector to autofree this memory. 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the effective address of the start of the buffer. 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this buffer address is known to have been freed 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * previously. 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final PlatformAddress getEffectiveAddress() { 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getBaseAddress().offsetBytes(offset); 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Explicitly free the memory used by this direct byte buffer. If the memory 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * has already been freed then this is a no-op. Once the memory has been 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * freed then operations requiring access to the memory will throw an 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <code>IllegalStateException</code>. 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note this is is possible that the memory is freed by code that reaches 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * into the address and explicitly frees it 'beneith' us -- this is bad 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * form. 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void free() { 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isAddressValid()) { 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project markAddressInvalid(); 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project safeAddress.address.free(); 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final protected byte[] protectedArray() { 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final protected int protectedArrayOffset() { 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final protected boolean protectedHasArray() { 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // copied from newer version of harmony 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int getByteCapacity() { 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return capacity; 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 290