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