12cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom/* 22cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Copyright (C) 2007 The Android Open Source Project 32cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 42cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 52cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * you may not use this file except in compliance with the License. 62cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * You may obtain a copy of the License at 72cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 82cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 92cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 102cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 112cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 122cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * See the License for the specific language governing permissions and 142cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * limitations under the License. 152cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 162cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 172cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrompackage sun.misc; 182cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 192cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromimport dalvik.system.VMStack; 202cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromimport java.lang.reflect.Field; 212cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromimport java.lang.reflect.Modifier; 222cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 232cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom/** 242cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * The package name notwithstanding, this class is the quasi-standard 252cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * way for Java code to gain access to and use functionality which, 262cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * when unsupervised, would allow one to break the pointer/type safety 272cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * of Java. 282cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 292cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrompublic final class Unsafe { 302cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** Traditional dalvik name. */ 312cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom private static final Unsafe THE_ONE = new Unsafe(); 322cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** Traditional RI name. */ 332cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom private static final Unsafe theUnsafe = THE_ONE; 342cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 352cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 362cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * This class is only privately instantiable. 372cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 382cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom private Unsafe() {} 392cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 402cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 412cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets the unique instance of this class. This is only allowed in 422cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * very limited situations. 432cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 442cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public static Unsafe getUnsafe() { 452cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /* 462cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Only code on the bootclasspath is allowed to get at the 472cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Unsafe instance. 482cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 492cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom ClassLoader calling = VMStack.getCallingClassLoader(); 502cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if ((calling != null) && (calling != Unsafe.class.getClassLoader())) { 512cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new SecurityException("Unsafe access denied"); 522cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 532cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 542cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom return THE_ONE; 552cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 562cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 572cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 582cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets the raw byte offset from the start of an object's memory to 592cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * the memory used to store the indicated instance field. 602cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 612cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param field non-null; the field in question, which must be an 622cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * instance field 632cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the offset to the field 642cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 652cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public long objectFieldOffset(Field field) { 662cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (Modifier.isStatic(field.getModifiers())) { 672cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new IllegalArgumentException("valid for instance fields only"); 682cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 692cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom return field.getOffset(); 702cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 712cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 722cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 732cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets the offset from the start of an array object's memory to 742cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * the memory used to store its initial (zeroeth) element. 752cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 762cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param clazz non-null; class in question; must be an array class 772cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the offset to the initial element 782cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 792cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public int arrayBaseOffset(Class clazz) { 802cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Class<?> component = clazz.getComponentType(); 812cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (component == null) { 822cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new IllegalArgumentException("Valid for array classes only: " + clazz); 832cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 847ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi return getArrayBaseOffsetForComponentType(component); 852cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 862cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 872cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 882cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets the size of each element of the given array class. 892cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 902cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param clazz non-null; class in question; must be an array class 912cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return > 0; the size of each element of the array 922cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 932cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public int arrayIndexScale(Class clazz) { 942cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Class<?> component = clazz.getComponentType(); 952cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (component == null) { 962cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new IllegalArgumentException("Valid for array classes only: " + clazz); 972cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 987ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi return getArrayIndexScaleForComponentType(component); 992cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 1002cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1017ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi private static native int getArrayBaseOffsetForComponentType(Class component_class); 1027ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi private static native int getArrayIndexScaleForComponentType(Class component_class); 1037ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi 1042cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1052cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Performs a compare-and-set operation on an <code>int</code> 1062cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * field within the given object. 1072cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1082cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1092cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1102cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param expectedValue expected value of the field 1112cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue new value to store in the field if the contents are 1122cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * as expected 1132cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return <code>true</code> if the new value was in fact stored, and 1142cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <code>false</code> if not 1152cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1162cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native boolean compareAndSwapInt(Object obj, long offset, 1172cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom int expectedValue, int newValue); 1182cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1192cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1202cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Performs a compare-and-set operation on a <code>long</code> 1212cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * field within the given object. 1222cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1232cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1242cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1252cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param expectedValue expected value of the field 1262cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue new value to store in the field if the contents are 1272cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * as expected 1282cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return <code>true</code> if the new value was in fact stored, and 1292cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <code>false</code> if not 1302cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1312cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native boolean compareAndSwapLong(Object obj, long offset, 1322cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom long expectedValue, long newValue); 1332cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1342cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1352cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Performs a compare-and-set operation on an <code>Object</code> 1362cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * field (that is, a reference field) within the given object. 1372cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1382cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1392cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1402cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param expectedValue expected value of the field 1412cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue new value to store in the field if the contents are 1422cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * as expected 1432cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return <code>true</code> if the new value was in fact stored, and 1442cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <code>false</code> if not 1452cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1462cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native boolean compareAndSwapObject(Object obj, long offset, 1472cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Object expectedValue, Object newValue); 1482cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1492cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1502cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets an <code>int</code> field from the given object, 1512cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 1522cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1532cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1542cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1552cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 1562cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1572cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native int getIntVolatile(Object obj, long offset); 1582cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1592cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1602cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores an <code>int</code> field into the given object, 1612cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 1622cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1632cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1642cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1652cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 1662cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1672cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putIntVolatile(Object obj, long offset, int newValue); 1682cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1692cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1702cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets a <code>long</code> field from the given object, 1712cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 1722cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1732cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1742cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1752cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 1762cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1772cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native long getLongVolatile(Object obj, long offset); 1782cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1792cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1802cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores a <code>long</code> field into the given object, 1812cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 1822cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1832cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1842cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1852cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 1862cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1872cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putLongVolatile(Object obj, long offset, long newValue); 1882cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1892cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1902cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets an <code>Object</code> field from the given object, 1912cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 1922cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1932cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1942cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1952cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 1962cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1972cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native Object getObjectVolatile(Object obj, long offset); 1982cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1992cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2002cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores an <code>Object</code> field into the given object, 2012cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 2022cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2032cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2042cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2052cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 2062cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2072cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putObjectVolatile(Object obj, long offset, 2082cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Object newValue); 2092cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2102cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2112cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets an <code>int</code> field from the given object. 2122cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2132cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2142cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2152cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 2162cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2172cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native int getInt(Object obj, long offset); 2182cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2192cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2202cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores an <code>int</code> field into the given object. 2212cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2222cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2232cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2242cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 2252cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2262cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putInt(Object obj, long offset, int newValue); 2272cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2282cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2292cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Lazy set an int field. 2302cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2312cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putOrderedInt(Object obj, long offset, int newValue); 2322cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2332cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2342cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets a <code>long</code> field from the given object. 2352cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2362cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2372cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2382cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 2392cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2402cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native long getLong(Object obj, long offset); 2412cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2422cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2432cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores a <code>long</code> field into the given object. 2442cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2452cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2462cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2472cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 2482cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2492cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putLong(Object obj, long offset, long newValue); 2502cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2512cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2522cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Lazy set a long field. 2532cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2542cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putOrderedLong(Object obj, long offset, long newValue); 2552cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2562cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2572cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets an <code>Object</code> field from the given object. 2582cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2592cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2602cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2612cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 2622cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2632cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native Object getObject(Object obj, long offset); 2642cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2652cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2662cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores an <code>Object</code> field into the given object. 2672cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2682cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2692cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2702cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 2712cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2722cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putObject(Object obj, long offset, Object newValue); 2732cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2742cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2752cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Lazy set an object field. 2762cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2772cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putOrderedObject(Object obj, long offset, 2782cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Object newValue); 2792cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2802cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2812cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Parks the calling thread for the specified amount of time, 2822cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * unless the "permit" for the thread is already available (due to 2832cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * a previous call to {@link #unpark}. This method may also return 2842cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * spuriously (that is, without the thread being told to unpark 2852cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * and without the indicated amount of time elapsing). 2862cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2872cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <p>See {@link java.util.concurrent.locks.LockSupport} for more 2882cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * in-depth information of the behavior of this method.</p> 2892cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2902cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param absolute whether the given time value is absolute 2912cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * milliseconds-since-the-epoch (<code>true</code>) or relative 2922cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * nanoseconds-from-now (<code>false</code>) 2932cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param time the (absolute millis or relative nanos) time value 2942cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2952cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public void park(boolean absolute, long time) { 2962cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (absolute) { 2972cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Thread.currentThread().parkUntil(time); 2982cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } else { 2992cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Thread.currentThread().parkFor(time); 3002cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 3012cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 3022cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 3032cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 3042cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Unparks the given object, which must be a {@link Thread}. 3052cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 3062cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <p>See {@link java.util.concurrent.locks.LockSupport} for more 3072cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * in-depth information of the behavior of this method.</p> 3082cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 3092cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; the object to unpark 3102cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 3112cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public void unpark(Object obj) { 3122cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (obj instanceof Thread) { 3132cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom ((Thread) obj).unpark(); 3142cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } else { 3152cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new IllegalArgumentException("valid for Threads only"); 3162cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 3172cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 3182cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 3192cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 3202cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Allocates an instance of the given class without running the constructor. 3212cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * The class' <clinit> will be run, if necessary. 3222cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 3232cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native Object allocateInstance(Class<?> c); 3242cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom} 325