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 &gt; 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