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