12cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom/* 2c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. 3f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 42cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 5f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * This code is free software; you can redistribute it and/or modify it 6f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * under the terms of the GNU General Public License version 2 only, as 7f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * published by the Free Software Foundation. Oracle designates this 8f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * particular file as subject to the "Classpath" exception as provided 9f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * by Oracle in the LICENSE file that accompanied this code. 102cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 11f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * This code is distributed in the hope that it will be useful, but WITHOUT 12f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * version 2 for more details (a copy is included in the LICENSE file that 15f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * accompanied this code). 162cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 17f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * You should have received a copy of the GNU General Public License version 18f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * 2 along with this work; if not, write to the Free Software Foundation, 19f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * 21f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * or visit www.oracle.com if you need additional information or have any 23f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * questions. 242cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 252cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 262cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrompackage sun.misc; 272cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 282cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromimport dalvik.system.VMStack; 292cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromimport java.lang.reflect.Field; 302cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromimport java.lang.reflect.Modifier; 312cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 322cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom/** 33f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * A collection of methods for performing low-level, unsafe operations. 34f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * Although the class and all methods are public, use of this class is 35f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * limited because only trusted code can obtain instances of it. 36f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * 37f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * @author John R. Rose 38f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath * @see #getUnsafe 392cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 402cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrompublic final class Unsafe { 412cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** Traditional dalvik name. */ 422cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom private static final Unsafe THE_ONE = new Unsafe(); 43f1934b47a2ae60f5d75dd174cf8cd1f44fa22d25Narayan Kamath 442cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom private static final Unsafe theUnsafe = THE_ONE; 458d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public static final int INVALID_FIELD_OFFSET = -1; 462cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 472cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 482cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * This class is only privately instantiable. 492cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 502cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom private Unsafe() {} 512cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 522cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 532cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets the unique instance of this class. This is only allowed in 542cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * very limited situations. 552cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 562cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public static Unsafe getUnsafe() { 572cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /* 582cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Only code on the bootclasspath is allowed to get at the 592cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Unsafe instance. 602cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 612cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom ClassLoader calling = VMStack.getCallingClassLoader(); 622cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if ((calling != null) && (calling != Unsafe.class.getClassLoader())) { 632cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new SecurityException("Unsafe access denied"); 642cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 652cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 662cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom return THE_ONE; 672cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 682cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 692cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 702cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets the raw byte offset from the start of an object's memory to 712cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * the memory used to store the indicated instance field. 722cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 732cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param field non-null; the field in question, which must be an 742cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * instance field 752cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the offset to the field 762cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 772cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public long objectFieldOffset(Field field) { 782cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (Modifier.isStatic(field.getModifiers())) { 792cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new IllegalArgumentException("valid for instance fields only"); 802cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 812cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom return field.getOffset(); 822cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 832cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 842cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 852cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets the offset from the start of an array object's memory to 862cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * the memory used to store its initial (zeroeth) element. 872cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 882cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param clazz non-null; class in question; must be an array class 892cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the offset to the initial element 902cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 912cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public int arrayBaseOffset(Class clazz) { 922cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Class<?> component = clazz.getComponentType(); 932cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (component == null) { 942cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new IllegalArgumentException("Valid for array classes only: " + clazz); 952cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 967ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi return getArrayBaseOffsetForComponentType(component); 972cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 982cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 992cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1002cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets the size of each element of the given array class. 1012cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1022cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param clazz non-null; class in question; must be an array class 1032cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return > 0; the size of each element of the array 1042cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1052cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public int arrayIndexScale(Class clazz) { 1062cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Class<?> component = clazz.getComponentType(); 1072cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (component == null) { 1082cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new IllegalArgumentException("Valid for array classes only: " + clazz); 1092cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 1107ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi return getArrayIndexScaleForComponentType(component); 1112cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 1122cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1137ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi private static native int getArrayBaseOffsetForComponentType(Class component_class); 1147ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi private static native int getArrayIndexScaleForComponentType(Class component_class); 1157ce6ae5ece6b7a2085d4445e2030f964986dca88Hiroshi Yamauchi 1162cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1172cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Performs a compare-and-set operation on an <code>int</code> 1182cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * field within the given object. 1192cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1202cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1212cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1222cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param expectedValue expected value of the field 1232cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue new value to store in the field if the contents are 1242cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * as expected 1252cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return <code>true</code> if the new value was in fact stored, and 1262cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <code>false</code> if not 1272cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1282cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native boolean compareAndSwapInt(Object obj, long offset, 1292cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom int expectedValue, int newValue); 1302cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1312cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1322cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Performs a compare-and-set operation on a <code>long</code> 1332cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * field within the given object. 1342cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1352cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1362cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1372cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param expectedValue expected value of the field 1382cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue new value to store in the field if the contents are 1392cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * as expected 1402cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return <code>true</code> if the new value was in fact stored, and 1412cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <code>false</code> if not 1422cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1432cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native boolean compareAndSwapLong(Object obj, long offset, 1442cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom long expectedValue, long newValue); 1452cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1462cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1472cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Performs a compare-and-set operation on an <code>Object</code> 1482cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * field (that is, a reference field) within the given object. 1492cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1502cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1512cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1522cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param expectedValue expected value of the field 1532cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue new value to store in the field if the contents are 1542cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * as expected 1552cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return <code>true</code> if the new value was in fact stored, and 1562cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <code>false</code> if not 1572cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1582cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native boolean compareAndSwapObject(Object obj, long offset, 1592cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Object expectedValue, Object newValue); 1602cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1612cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1622cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets an <code>int</code> field from the given object, 1632cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 1642cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1652cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1662cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1672cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 1682cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1692cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native int getIntVolatile(Object obj, long offset); 1702cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1712cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1722cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores an <code>int</code> field into the given object, 1732cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 1742cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1752cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1762cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1772cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 1782cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1792cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putIntVolatile(Object obj, long offset, int newValue); 1802cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1812cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1822cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets a <code>long</code> field from the given object, 1832cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 1842cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1852cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1862cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1872cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 1882cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1892cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native long getLongVolatile(Object obj, long offset); 1902cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 1912cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 1922cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores a <code>long</code> field into the given object, 1932cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 1942cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 1952cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 1962cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 1972cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 1982cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 1992cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putLongVolatile(Object obj, long offset, long newValue); 2002cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2012cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2022cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets an <code>Object</code> field from the given object, 2032cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 2042cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2052cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2062cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2072cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 2082cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2092cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native Object getObjectVolatile(Object obj, long offset); 2102cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2112cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2122cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores an <code>Object</code> field into the given object, 2132cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * using <code>volatile</code> semantics. 2142cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2152cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2162cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2172cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 2182cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2192cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putObjectVolatile(Object obj, long offset, 2202cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Object newValue); 2212cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2222cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2232cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets an <code>int</code> field from the given object. 2242cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2252cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2262cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2272cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 2282cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2292cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native int getInt(Object obj, long offset); 2302cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2312cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2322cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores an <code>int</code> field into the given object. 2332cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2342cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2352cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2362cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 2372cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2382cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putInt(Object obj, long offset, int newValue); 2392cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2402cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2412cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Lazy set an int field. 2422cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2432cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putOrderedInt(Object obj, long offset, int newValue); 2442cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2452cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2462cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets a <code>long</code> field from the given object. 2472cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2482cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2492cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2502cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 2512cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2522cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native long getLong(Object obj, long offset); 2532cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2542cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2552cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores a <code>long</code> field into the given object. 2562cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2572cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2582cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2592cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 2602cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2612cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putLong(Object obj, long offset, long newValue); 2622cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2632cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2642cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Lazy set a long field. 2652cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2662cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putOrderedLong(Object obj, long offset, long newValue); 2672cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2682cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2692cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Gets an <code>Object</code> field from the given object. 2702cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2712cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2722cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2732cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @return the retrieved value 2742cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2752cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native Object getObject(Object obj, long offset); 2762cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2772cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2782cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Stores an <code>Object</code> field into the given object. 2792cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 2802cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; object containing the field 2812cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param offset offset to the field within <code>obj</code> 2822cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param newValue the value to store 2832cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2842cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putObject(Object obj, long offset, Object newValue); 2852cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2862cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 2872cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Lazy set an object field. 2882cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 2892cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native void putOrderedObject(Object obj, long offset, 2902cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom Object newValue); 2912cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 2928d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski 2938d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native boolean getBoolean(Object obj, long offset); 2948d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native void putBoolean(Object obj, long offset, boolean newValue); 2958d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native byte getByte(Object obj, long offset); 2968d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native void putByte(Object obj, long offset, byte newValue); 2978d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native char getChar(Object obj, long offset); 2988d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native void putChar(Object obj, long offset, char newValue); 2998d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native short getShort(Object obj, long offset); 3008d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native void putShort(Object obj, long offset, short newValue); 3018d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native float getFloat(Object obj, long offset); 3028d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native void putFloat(Object obj, long offset, float newValue); 3038d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native double getDouble(Object obj, long offset); 3048d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski public native void putDouble(Object obj, long offset, double newValue); 3058d05e88f57c1ea5543d4012687c70cd64efcada0Piotr Jastrzebski 3062cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 3072cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Parks the calling thread for the specified amount of time, 3082cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * unless the "permit" for the thread is already available (due to 3092cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * a previous call to {@link #unpark}. This method may also return 3102cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * spuriously (that is, without the thread being told to unpark 3112cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * and without the indicated amount of time elapsing). 3122cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 3132cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <p>See {@link java.util.concurrent.locks.LockSupport} for more 3142cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * in-depth information of the behavior of this method.</p> 3152cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 3162cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param absolute whether the given time value is absolute 3172cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * milliseconds-since-the-epoch (<code>true</code>) or relative 3182cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * nanoseconds-from-now (<code>false</code>) 3192cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param time the (absolute millis or relative nanos) time value 3202cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 3212cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public void park(boolean absolute, long time) { 3222cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (absolute) { 3233a2414f45502454bdf0a4ff28f50682f72e4f435Neil Fuller Thread.currentThread().parkUntil$(time); 3242cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } else { 3253a2414f45502454bdf0a4ff28f50682f72e4f435Neil Fuller Thread.currentThread().parkFor$(time); 3262cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 3272cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 3282cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 3292cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 3302cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Unparks the given object, which must be a {@link Thread}. 3312cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 3322cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * <p>See {@link java.util.concurrent.locks.LockSupport} for more 3332cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * in-depth information of the behavior of this method.</p> 3342cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 3352cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * @param obj non-null; the object to unpark 3362cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 3372cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public void unpark(Object obj) { 3382cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom if (obj instanceof Thread) { 3393a2414f45502454bdf0a4ff28f50682f72e4f435Neil Fuller ((Thread) obj).unpark$(); 3402cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } else { 3412cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom throw new IllegalArgumentException("valid for Threads only"); 3422cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 3432cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 3442cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 3452cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 3462cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Allocates an instance of the given class without running the constructor. 3472cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * The class' <clinit> will be run, if necessary. 3482cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 3492cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom public native Object allocateInstance(Class<?> c); 3503d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 3513d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski public native int addressSize(); 3523d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 3533d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski public native int pageSize(); 3543d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 3553d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski public native long allocateMemory(long bytes); 3563d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 3573d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski public native void freeMemory(long address); 3583d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 3593d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski public native void setMemory(long address, long bytes, byte value); 3603d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 361c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native byte getByte(long address); 3623d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 363c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native void putByte(long address, byte x); 3643d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 365c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native short getShort(long address); 3663d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 367c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native void putShort(long address, short x); 3683d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 369c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native char getChar(long address); 3703d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 371c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native void putChar(long address, char x); 3723d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 373c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native int getInt(long address); 3743d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 375c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native void putInt(long address, int x); 3763d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 377c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native long getLong(long address); 3783d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 379c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native void putLong(long address, long x); 3803d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 381c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native float getFloat(long address); 3823d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 383c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native void putFloat(long address, float x); 3843d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 385c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native double getDouble(long address); 3863d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 387c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath public native void putDouble(long address, double x); 3883d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 389648446e24ad82c2c660e158be8f32faabf082420Piotr Jastrzebski public native void copyMemoryToPrimitiveArray(long srcAddr, 390648446e24ad82c2c660e158be8f32faabf082420Piotr Jastrzebski Object dst, long dstOffset, long bytes); 391648446e24ad82c2c660e158be8f32faabf082420Piotr Jastrzebski 392648446e24ad82c2c660e158be8f32faabf082420Piotr Jastrzebski public native void copyMemoryFromPrimitiveArray(Object src, long srcOffset, 393648446e24ad82c2c660e158be8f32faabf082420Piotr Jastrzebski long dstAddr, long bytes); 394648446e24ad82c2c660e158be8f32faabf082420Piotr Jastrzebski 395648446e24ad82c2c660e158be8f32faabf082420Piotr Jastrzebski public native void copyMemory(long srcAddr, long dstAddr, long bytes); 396c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 397c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 398c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // The following contain CAS-based Java implementations used on 399c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // platforms not supporting native instructions 400c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 401c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin /** 402c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Atomically adds the given value to the current value of a field 403c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * or array element within the given object {@code o} 404c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * at the given {@code offset}. 405c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 406c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param o object/array to update the field/element in 407c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param offset field/element offset 408c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param delta the value to add 409c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @return the previous value 410c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @since 1.8 411c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin */ 412c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // @HotSpotIntrinsicCandidate 413c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin public final int getAndAddInt(Object o, long offset, int delta) { 414c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin int v; 415c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin do { 416c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin v = getIntVolatile(o, offset); 417c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } while (!compareAndSwapInt(o, offset, v, v + delta)); 418c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin return v; 419c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } 420c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 421c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin /** 422c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Atomically adds the given value to the current value of a field 423c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * or array element within the given object {@code o} 424c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * at the given {@code offset}. 425c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 426c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param o object/array to update the field/element in 427c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param offset field/element offset 428c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param delta the value to add 429c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @return the previous value 430c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @since 1.8 431c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin */ 432c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // @HotSpotIntrinsicCandidate 433c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin public final long getAndAddLong(Object o, long offset, long delta) { 434c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin long v; 435c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin do { 436c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin v = getLongVolatile(o, offset); 437c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } while (!compareAndSwapLong(o, offset, v, v + delta)); 438c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin return v; 439c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } 440c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 441c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin /** 442c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Atomically exchanges the given value with the current value of 443c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * a field or array element within the given object {@code o} 444c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * at the given {@code offset}. 445c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 446c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param o object/array to update the field/element in 447c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param offset field/element offset 448c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param newValue new value 449c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @return the previous value 450c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @since 1.8 451c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin */ 452c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // @HotSpotIntrinsicCandidate 453c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin public final int getAndSetInt(Object o, long offset, int newValue) { 454c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin int v; 455c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin do { 456c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin v = getIntVolatile(o, offset); 457c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } while (!compareAndSwapInt(o, offset, v, newValue)); 458c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin return v; 459c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } 460c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 461c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin /** 462c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Atomically exchanges the given value with the current value of 463c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * a field or array element within the given object {@code o} 464c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * at the given {@code offset}. 465c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 466c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param o object/array to update the field/element in 467c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param offset field/element offset 468c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param newValue new value 469c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @return the previous value 470c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @since 1.8 471c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin */ 472c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // @HotSpotIntrinsicCandidate 473c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin public final long getAndSetLong(Object o, long offset, long newValue) { 474c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin long v; 475c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin do { 476c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin v = getLongVolatile(o, offset); 477c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } while (!compareAndSwapLong(o, offset, v, newValue)); 478c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin return v; 479c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } 480c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 481c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin /** 482c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Atomically exchanges the given reference value with the current 483c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * reference value of a field or array element within the given 484c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * object {@code o} at the given {@code offset}. 485c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 486c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param o object/array to update the field/element in 487c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param offset field/element offset 488c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @param newValue new value 489c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @return the previous value 490c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @since 1.8 491c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin */ 492c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // @HotSpotIntrinsicCandidate 493c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin public final Object getAndSetObject(Object o, long offset, Object newValue) { 494c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin Object v; 495c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin do { 496c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin v = getObjectVolatile(o, offset); 497c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } while (!compareAndSwapObject(o, offset, v, newValue)); 498c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin return v; 499c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin } 500c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 501c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 502c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin /** 503c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Ensures that loads before the fence will not be reordered with loads and 504c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * stores after the fence; a "LoadLoad plus LoadStore barrier". 505c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 506c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Corresponds to C11 atomic_thread_fence(memory_order_acquire) 507c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * (an "acquire fence"). 508c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 509c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * A pure LoadLoad fence is not provided, since the addition of LoadStore 510c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * is almost always desired, and most current hardware instructions that 511c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * provide a LoadLoad barrier also provide a LoadStore barrier for free. 512c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @since 1.8 513c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin */ 514c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // @HotSpotIntrinsicCandidate 515c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin public native void loadFence(); 516c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 517c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin /** 518c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Ensures that loads and stores before the fence will not be reordered with 519c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * stores after the fence; a "StoreStore plus LoadStore barrier". 520c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 521c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Corresponds to C11 atomic_thread_fence(memory_order_release) 522c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * (a "release fence"). 523c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 524c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * A pure StoreStore fence is not provided, since the addition of LoadStore 525c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * is almost always desired, and most current hardware instructions that 526c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * provide a StoreStore barrier also provide a LoadStore barrier for free. 527c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @since 1.8 528c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin */ 529c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // @HotSpotIntrinsicCandidate 530c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin public native void storeFence(); 531c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin 532c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin /** 533c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Ensures that loads and stores before the fence will not be reordered 534c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * with loads and stores after the fence. Implies the effects of both 535c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * loadFence() and storeFence(), and in addition, the effect of a StoreLoad 536c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * barrier. 537c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * 538c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * Corresponds to C11 atomic_thread_fence(memory_order_seq_cst). 539c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin * @since 1.8 540c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin */ 541c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin // @HotSpotIntrinsicCandidate 542c25c39857b0f5057ee9d5a548e6157532db1712aIgor Murashkin public native void fullFence(); 5432cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom} 544