1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilsonpackage java.nio; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.PlatformAddress; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Helper class for operations on direct ByteBuffer 23f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.nio.ByteBuffer 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass DirectByteBuffers { 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Explicitly frees the memory used by the given direct byte buffer. 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the memory is known to already have been freed then this is a no-op. 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Once the memory has been freed then operations requiring access to the 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * memory will throw an <code>IllegalStateException</code>. 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note this is is possible that the memory is freed by code that reaches 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * into the address and explicitly frees it 'beneith' us -- this is bad 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * form. 38eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param directBuffer 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the direct byte buffer memory to free 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the buffer is <code>null</code> or is not a 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>direct</em> byte buffer. 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void free(ByteBuffer directBuffer) { 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((directBuffer == null) || (!directBuffer.isDirect())) { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DirectByteBuffer buf = (DirectByteBuffer) directBuffer; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.free(); 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the platform address of the start of this buffer instance. 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>You must not attempt to free the returned address!!</em> It may not 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be an address that was explicitly malloc'ed (i.e. if this buffer is the 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * result of a split); and it may be memory shared by multiple buffers. 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If you can guarantee that you want to free the underlying memory call the 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * #free() method on this instance -- generally applications will rely on 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the garbage collector to autofree this memory. 62eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param directBuffer 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the direct byte buffer 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the effective address of the start of the buffer. 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this buffer address is known to have been freed 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * previously. 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static PlatformAddress getEffectiveAddress(ByteBuffer directBuffer) { 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return toDirectBuffer(directBuffer).getEffectiveAddress(); 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static DirectByteBuffer toDirectBuffer(ByteBuffer directBuffer) { 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((directBuffer == null) || (!directBuffer.isDirect())) { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (DirectByteBuffer) directBuffer; 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 82