1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
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
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage sun.misc;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.system.VMStack;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Field;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Modifier;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The package name notwithstanding, this class is the quasi-standard
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * way for Java code to gain access to and use functionality which,
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when unsupervised, would allow one to break the pointer/type safety
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of Java.
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class Unsafe {
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** non-null; unique instance of this class */
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final Unsafe THE_ONE = new Unsafe();
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This class is only privately instantiable.
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
36b74b0c7dabd2b9d562a1b77388052a191d1bb400Jesse Wilson    private Unsafe() {}
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the unique instance of this class. This is only allowed in
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * very limited situations.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Unsafe getUnsafe() {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Only code on the bootclasspath is allowed to get at the
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Unsafe instance.
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
47942ed2f915d938767370935d1da1b8ac735525e0Jesse Wilson        ClassLoader calling = VMStack.getCallingClassLoader();
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((calling != null) && (calling != Unsafe.class.getClassLoader())) {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SecurityException("Unsafe access denied");
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return THE_ONE;
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the raw byte offset from the start of an object's memory to
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the memory used to store the indicated instance field.
58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field non-null; the field in question, which must be an
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * instance field
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the offset to the field
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long objectFieldOffset(Field field) {
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (Modifier.isStatic(field.getModifiers())) {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    "valid for instance fields only");
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return objectFieldOffset0(field);
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Helper for {@link #objectFieldOffset}, which does all the work,
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * assuming the parameter is deemed valid.
75f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field non-null; the instance field
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the offset to the field
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static native long objectFieldOffset0(Field field);
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the offset from the start of an array object's memory to
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the memory used to store its initial (zeroeth) element.
84f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param clazz non-null; class in question; must be an array class
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the offset to the initial element
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int arrayBaseOffset(Class clazz) {
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (! clazz.isArray()) {
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    "valid for array classes only");
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return arrayBaseOffset0(clazz);
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Helper for {@link #arrayBaseOffset}, which does all the work,
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * assuming the parameter is deemed valid.
100f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the offset to the field
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static native int arrayBaseOffset0(Class clazz);
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the size of each element of the given array class.
107f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param clazz non-null; class in question; must be an array class
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return > 0; the size of each element of the array
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int arrayIndexScale(Class clazz) {
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (! clazz.isArray()) {
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    "valid for array classes only");
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return arrayIndexScale0(clazz);
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Helper for {@link #arrayIndexScale}, which does all the work,
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * assuming the parameter is deemed valid.
123f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the offset to the field
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static native int arrayIndexScale0(Class clazz);
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Performs a compare-and-set operation on an <code>int</code>
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * field within the given object.
131f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param expectedValue expected value of the field
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue new value to store in the field if the contents are
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as expected
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return <code>true</code> if the new value was in fact stored, and
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>false</code> if not
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native boolean compareAndSwapInt(Object obj, long offset,
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int expectedValue, int newValue);
142f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Performs a compare-and-set operation on a <code>long</code>
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * field within the given object.
146f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param expectedValue expected value of the field
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue new value to store in the field if the contents are
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as expected
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return <code>true</code> if the new value was in fact stored, and
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>false</code> if not
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native boolean compareAndSwapLong(Object obj, long offset,
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long expectedValue, long newValue);
157f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Performs a compare-and-set operation on an <code>Object</code>
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * field (that is, a reference field) within the given object.
161f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param expectedValue expected value of the field
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue new value to store in the field if the contents are
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as expected
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return <code>true</code> if the new value was in fact stored, and
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>false</code> if not
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native boolean compareAndSwapObject(Object obj, long offset,
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object expectedValue, Object newValue);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets an <code>int</code> field from the given object,
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * using <code>volatile</code> semantics.
176f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the retrieved value
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native int getIntVolatile(Object obj, long offset);
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores an <code>int</code> field into the given object,
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * using <code>volatile</code> semantics.
186f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
189f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @param newValue the value to store
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native void putIntVolatile(Object obj, long offset, int newValue);
192f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets a <code>long</code> field from the given object,
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * using <code>volatile</code> semantics.
196f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the retrieved value
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native long getLongVolatile(Object obj, long offset);
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores a <code>long</code> field into the given object,
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * using <code>volatile</code> semantics.
206f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
209f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @param newValue the value to store
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native void putLongVolatile(Object obj, long offset, long newValue);
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets an <code>Object</code> field from the given object,
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * using <code>volatile</code> semantics.
216f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the retrieved value
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native Object getObjectVolatile(Object obj, long offset);
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores an <code>Object</code> field into the given object,
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * using <code>volatile</code> semantics.
226f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
229f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @param newValue the value to store
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native void putObjectVolatile(Object obj, long offset,
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object newValue);
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets an <code>int</code> field from the given object.
236f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the retrieved value
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native int getInt(Object obj, long offset);
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores an <code>int</code> field into the given object.
245f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
248f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @param newValue the value to store
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native void putInt(Object obj, long offset, int newValue);
2516232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
2526232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    /**
2536232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * Lazy set an int field.
2546232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     */
25586c9263b601845bdc2096c980afb35e86778528fAndy McFadden    public native void putOrderedInt(Object obj, long offset, int newValue);
2566232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets a <code>long</code> field from the given object.
259f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the retrieved value
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native long getLong(Object obj, long offset);
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores a <code>long</code> field into the given object.
268f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
271f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @param newValue the value to store
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native void putLong(Object obj, long offset, long newValue);
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2766232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * Lazy set a long field.
2776232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     */
27886c9263b601845bdc2096c980afb35e86778528fAndy McFadden    public native void putOrderedLong(Object obj, long offset, long newValue);
2796232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
2806232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    /**
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets an <code>Object</code> field from the given object.
282f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the retrieved value
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native Object getObject(Object obj, long offset);
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores an <code>Object</code> field into the given object.
291f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; object containing the field
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset offset to the field within <code>obj</code>
294f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @param newValue the value to store
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public native void putObject(Object obj, long offset, Object newValue);
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2996232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * Lazy set an object field.
3006232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     */
30186c9263b601845bdc2096c980afb35e86778528fAndy McFadden    public native void putOrderedObject(Object obj, long offset,
30286c9263b601845bdc2096c980afb35e86778528fAndy McFadden            Object newValue);
3036232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
3046232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    /**
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parks the calling thread for the specified amount of time,
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unless the "permit" for the thread is already available (due to
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a previous call to {@link #unpark}. This method may also return
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * spuriously (that is, without the thread being told to unpark
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and without the indicated amount of time elapsing).
310f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>See {@link java.util.concurrent.locks.LockSupport} for more
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in-depth information of the behavior of this method.</p>
313f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param absolute whether the given time value is absolute
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * milliseconds-since-the-epoch (<code>true</code>) or relative
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * nanoseconds-from-now (<code>false</code>)
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param time the (absolute millis or relative nanos) time value
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void park(boolean absolute, long time) {
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (absolute) {
321b74b0c7dabd2b9d562a1b77388052a191d1bb400Jesse Wilson            Thread.currentThread().parkUntil(time);
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
323b74b0c7dabd2b9d562a1b77388052a191d1bb400Jesse Wilson            Thread.currentThread().parkFor(time);
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Unparks the given object, which must be a {@link Thread}.
329f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>See {@link java.util.concurrent.locks.LockSupport} for more
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in-depth information of the behavior of this method.</p>
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj non-null; the object to unpark
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void unpark(Object obj) {
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (obj instanceof Thread) {
337b74b0c7dabd2b9d562a1b77388052a191d1bb400Jesse Wilson            ((Thread) obj).unpark();
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException("valid for Threads only");
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
343