1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
229957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
329957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
429957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * This code is free software; you can redistribute it and/or modify it
529957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * under the terms of the GNU General Public License version 2 only, as
629957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * published by the Free Software Foundation.  Oracle designates this
729957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * particular file as subject to the "Classpath" exception as provided
829957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * by Oracle in the LICENSE file that accompanied this code.
929957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
1029957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * This code is distributed in the hope that it will be useful, but WITHOUT
1129957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1229957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1329957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * version 2 for more details (a copy is included in the LICENSE file that
1429957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * accompanied this code).
1529957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
1629957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * You should have received a copy of the GNU General Public License version
1729957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * 2 along with this work; if not, write to the Free Software Foundation,
1829957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1929957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
2029957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2129957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * or visit www.oracle.com if you need additional information or have any
2229957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * questions.
2329957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer */
2429957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer
2529957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer/*
2629957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * This file is available under and governed by the GNU General Public
2729957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * License version 2 only, as published by the Free Software Foundation.
2829957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * However, the following notice accompanied the original version of this
2929957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * file:
3029957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Written by Doug Lea with assistance from members of JCP JSR-166
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Expert Group and released to the public domain, as explained at
33a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * http://creativecommons.org/publicdomain/zero/1.0/
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.concurrent.atomic;
377365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilson
386975f84c2ed72e1e26d20190b6f318718c849008Tobias Thiererimport dalvik.system.VMStack; // Android-added
3991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravleimport java.lang.reflect.Field;
4091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravleimport java.lang.reflect.Modifier;
41edf43d27e240d82106f39ae91404963c23987234Narayan Kamathimport java.security.AccessController;
42ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniakimport java.security.PrivilegedActionException;
43b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.security.PrivilegedExceptionAction;
44b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.function.IntBinaryOperator;
45b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.function.IntUnaryOperator;
46b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport sun.reflect.CallerSensitive;
47b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport sun.reflect.Reflection;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A reflection-based utility that enables atomic updates to
51bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * designated {@code volatile int} fields of designated classes.
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is designed for use in atomic data structures in which
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * several fields of the same node are independently subject to atomic
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * updates.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
56bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <p>Note that the guarantees of the {@code compareAndSet}
57bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * method in this class are weaker than in other atomic classes.
58bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Because this class cannot ensure that all uses of the field
59bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * are appropriate for purposes of atomic access, it can
60bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * guarantee atomicity only with respect to other invocations of
61bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * {@code compareAndSet} and {@code set} on the same updater.
62bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson *
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since 1.5
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Doug Lea
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param <T> The type of the object holding the updatable field
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
6791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravlepublic abstract class AtomicIntegerFieldUpdater<T> {
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
69bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Creates and returns an updater for objects with the given field.
70bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * The Class argument is needed to check that reflective types and
71bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * generic types match.
72bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param tclass the class of the objects holding the field
74bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @param fieldName the name of the field to be updated
75fd81a99407d318ea3d8b5782294a0644e580d126Neil Fuller     * @param <U> the type of instances of tclass
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the updater
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if the field is not a
78bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * volatile integer type
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws RuntimeException with a nested reflection-based
8091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * exception if the class does not hold field or is the wrong type,
8191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * or the field is inaccessible to the caller according to Java language
8291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * access control
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
84b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    @CallerSensitive
85b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass,
86b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                                              String fieldName) {
87b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return new AtomicIntegerFieldUpdaterImpl<U>
886975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer            (tclass, fieldName, VMStack.getStackClass1()); // Android-changed
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Protected do-nothing constructor for use by subclasses.
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected AtomicIntegerFieldUpdater() {
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
98bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically sets the field of the given object managed by this updater
99bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * to the given updated value if the current value {@code ==} the
100bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * expected value. This method is guaranteed to be atomic with respect to
101bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * other calls to {@code compareAndSet} and {@code set}, but not
102bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * necessarily with respect to other changes in the field.
103bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to conditionally set
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param expect the expected value
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param update the new value
107b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @return {@code true} if successful
108bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws ClassCastException if {@code obj} is not an instance
109bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * of the class possessing the field established in the constructor
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean compareAndSet(T obj, int expect, int update);
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
114bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically sets the field of the given object managed by this updater
115bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * to the given updated value if the current value {@code ==} the
116bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * expected value. This method is guaranteed to be atomic with respect to
117bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * other calls to {@code compareAndSet} and {@code set}, but not
118bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * necessarily with respect to other changes in the field.
119bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
12091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * <p><a href="package-summary.html#weakCompareAndSet">May fail
12191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * spuriously and does not provide ordering guarantees</a>, so is
12291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle     * only rarely an appropriate alternative to {@code compareAndSet}.
123bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to conditionally set
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param expect the expected value
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param update the new value
127b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @return {@code true} if successful
128bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws ClassCastException if {@code obj} is not an instance
129bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * of the class possessing the field established in the constructor
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean weakCompareAndSet(T obj, int expect, int update);
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
134bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Sets the field of the given object managed by this updater to the
135bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * given updated value. This operation is guaranteed to act as a volatile
136bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * store with respect to subsequent invocations of {@code compareAndSet}.
137bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to set
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue the new value
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void set(T obj, int newValue);
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1446232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * Eventually sets the field of the given object managed by this
1456232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * updater to the given updated value.
1466232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     *
1476232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @param obj An object whose field to set
1486232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @param newValue the new value
1496232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     * @since 1.6
1506232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson     */
1516232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    public abstract void lazySet(T obj, int newValue);
1526232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
1536232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson    /**
154bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Gets the current value held in the field of the given object managed
155bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * by this updater.
156bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to get
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current value
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int get(T obj);
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
163bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically sets the field of the given object managed by this updater
164bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * to the given value and returns the old value.
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to get and set
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue the new value
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the previous value
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getAndSet(T obj, int newValue) {
171b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev;
172b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
173b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
174b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, newValue));
175b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return prev;
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
179bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically increments by one the current value of the field of the
180bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * given object managed by this updater.
181bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to get and set
183bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return the previous value
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getAndIncrement(T obj) {
186b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
187b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
188b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
189b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = prev + 1;
190b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
191b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return prev;
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
195bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically decrements by one the current value of the field of the
196bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * given object managed by this updater.
197bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to get and set
199bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return the previous value
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getAndDecrement(T obj) {
202b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
203b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
204b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
205b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = prev - 1;
206b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
207b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return prev;
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
211bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically adds the given value to the current value of the field of
212bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * the given object managed by this updater.
213bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to get and set
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param delta the value to add
216bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return the previous value
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getAndAdd(T obj, int delta) {
219b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
220b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
221b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
222b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = prev + delta;
223b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
224b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return prev;
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
228bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically increments by one the current value of the field of the
229bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * given object managed by this updater.
230bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to get and set
232bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return the updated value
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int incrementAndGet(T obj) {
235b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
236b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
237b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
238b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = prev + 1;
239b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
240b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return next;
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
244bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically decrements by one the current value of the field of the
245bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * given object managed by this updater.
246bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to get and set
248bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return the updated value
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int decrementAndGet(T obj) {
251b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
252b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
253b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
254b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = prev - 1;
255b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
256b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return next;
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
260bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically adds the given value to the current value of the field of
261bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * the given object managed by this updater.
262bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj An object whose field to get and set
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param delta the value to add
265bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return the updated value
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int addAndGet(T obj, int delta) {
268b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
269b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
270b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
271b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = prev + delta;
272b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
273b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return next;
2745328e07d282bef36ac8b757bbee16a761415b2c4Przemyslaw Szczepaniak    }
2755328e07d282bef36ac8b757bbee16a761415b2c4Przemyslaw Szczepaniak
2765328e07d282bef36ac8b757bbee16a761415b2c4Przemyslaw Szczepaniak    /**
277b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * Atomically updates the field of the given object managed by this updater
278b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * with the results of applying the given function, returning the previous
279b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * value. The function should be side-effect-free, since it may be
280b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * re-applied when attempted updates fail due to contention among threads.
281b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     *
282b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param obj An object whose field to get and set
283b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param updateFunction a side-effect-free function
284b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @return the previous value
285b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @since 1.8
2865328e07d282bef36ac8b757bbee16a761415b2c4Przemyslaw Szczepaniak     */
287b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public final int getAndUpdate(T obj, IntUnaryOperator updateFunction) {
288b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
289b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
290b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
291b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = updateFunction.applyAsInt(prev);
292b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
293b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return prev;
294b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    }
295b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
296b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    /**
297b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * Atomically updates the field of the given object managed by this updater
298b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * with the results of applying the given function, returning the updated
299b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * value. The function should be side-effect-free, since it may be
300b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * re-applied when attempted updates fail due to contention among threads.
301b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     *
302b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param obj An object whose field to get and set
303b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param updateFunction a side-effect-free function
304b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @return the updated value
305b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @since 1.8
306b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     */
307b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public final int updateAndGet(T obj, IntUnaryOperator updateFunction) {
308b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
309b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
310b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
311b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = updateFunction.applyAsInt(prev);
312b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
313b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return next;
314b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    }
315b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
316b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    /**
317b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * Atomically updates the field of the given object managed by this
318b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * updater with the results of applying the given function to the
319b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * current and given values, returning the previous value. The
320b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * function should be side-effect-free, since it may be re-applied
321b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * when attempted updates fail due to contention among threads.  The
322b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * function is applied with the current value as its first argument,
323b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * and the given update as the second argument.
324b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     *
325b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param obj An object whose field to get and set
326b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param x the update value
327b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param accumulatorFunction a side-effect-free function of two arguments
328b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @return the previous value
329b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @since 1.8
330b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     */
331b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public final int getAndAccumulate(T obj, int x,
332b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                      IntBinaryOperator accumulatorFunction) {
333b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
334b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
335b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
336b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = accumulatorFunction.applyAsInt(prev, x);
337b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
338b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return prev;
339b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    }
340b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
341b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    /**
342b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * Atomically updates the field of the given object managed by this
343b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * updater with the results of applying the given function to the
344b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * current and given values, returning the updated value. The
345b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * function should be side-effect-free, since it may be re-applied
346b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * when attempted updates fail due to contention among threads.  The
347b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * function is applied with the current value as its first argument,
348b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * and the given update as the second argument.
349b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     *
350b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param obj An object whose field to get and set
351b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param x the update value
352b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @param accumulatorFunction a side-effect-free function of two arguments
353b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @return the updated value
354b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * @since 1.8
355b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     */
356b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public final int accumulateAndGet(T obj, int x,
357b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                      IntBinaryOperator accumulatorFunction) {
358b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int prev, next;
359b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        do {
360b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            prev = get(obj);
361b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            next = accumulatorFunction.applyAsInt(prev, x);
362b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } while (!compareAndSet(obj, prev, next));
363b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        return next;
364b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    }
365b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
366b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    /**
367b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * Standard hotspot implementation using intrinsics.
368b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     */
369b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    private static final class AtomicIntegerFieldUpdaterImpl<T>
370b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        extends AtomicIntegerFieldUpdater<T> {
371b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private final long offset;
373b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        /**
374b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak         * if field is protected, the subclass constructing updater, else
375b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak         * the same as tclass
376b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak         */
377ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak        private final Class<?> cclass;
378b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        /** class holding the field */
379b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        private final Class<T> tclass;
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
381b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        AtomicIntegerFieldUpdaterImpl(final Class<T> tclass,
382b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                      final String fieldName,
383b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                      final Class<?> caller) {
38491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle            final Field field;
38591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle            final int modifiers;
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
387b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                field = AccessController.doPrivileged(
388b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    new PrivilegedExceptionAction<Field>() {
389b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        public Field run() throws NoSuchFieldException {
390b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                            return tclass.getDeclaredField(fieldName);
391b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        }
392b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    });
39391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                modifiers = field.getModifiers();
3946975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer                // BEGIN Android-removed
3956232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                // sun.reflect.misc.ReflectUtil.ensureMemberAccess(
3966232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson                //     caller, tclass, null, modifiers);
39791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                // ClassLoader cl = tclass.getClassLoader();
39891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                // ClassLoader ccl = caller.getClassLoader();
39991770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                // if ((ccl != null) && (ccl != cl) &&
40091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                //     ((cl == null) || !isAncestor(cl, ccl))) {
401b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                //     sun.reflect.misc.ReflectUtil.checkPackageAccess(tclass);
40291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle                // }
4036975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer                // END Android-removed
4046975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer            // BEGIN Android-removed
40591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle            // } catch (PrivilegedActionException pae) {
40691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle            //     throw new RuntimeException(pae.getException());
4076975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer            // END Android-removed
408bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            } catch (Exception ex) {
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new RuntimeException(ex);
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
411bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson
412b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            if (field.getType() != int.class)
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IllegalArgumentException("Must be integer type");
414bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson
415bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            if (!Modifier.isVolatile(modifiers))
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IllegalArgumentException("Must be volatile type");
417bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson
418b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            this.cclass = (Modifier.isProtected(modifiers)) ? caller : tclass;
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.tclass = tclass;
420b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            this.offset = U.objectFieldOffset(field);
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
4236975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer        // BEGIN Android-removed
42491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        // /**
42591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //  * Returns true if the second classloader can be found in the first
42691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //  * classloader's delegation chain.
42791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //  * Equivalent to the inaccessible: first.isAncestor(second).
42891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //  */
429b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        // private static boolean isAncestor(ClassLoader first, ClassLoader second) {
43091770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //     ClassLoader acl = first;
43191770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //     do {
43291770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //         acl = acl.getParent();
43391770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //         if (second == acl) {
43491770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //             return true;
43591770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //         }
43691770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //     } while (acl != null);
43791770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        //     return false;
43891770798d8b9280d48d30df2ed7f63b3ed9b036fCalin Juravle        // }
4396975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer        // END Android-removed
440b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
441b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        /**
442b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak         * Checks that target argument is instance of cclass.  On
443b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak         * failure, throws cause.
444b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak         */
445b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        private final void accessCheck(T obj) {
446b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            if (!cclass.isInstance(obj))
447b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                throwAccessCheckException(obj);
448b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
449b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
450b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        /**
451b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak         * Throws access exception if accessCheck failed due to
452b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak         * protected access, else ClassCastException.
453b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak         */
454b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        private final void throwAccessCheckException(T obj) {
455b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            if (cclass == tclass)
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new ClassCastException();
457b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            else
458b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                throw new RuntimeException(
459b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    new IllegalAccessException(
460b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        "Class " +
461b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        cclass.getName() +
462b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        " can not access a protected member of class " +
463b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        tclass.getName() +
464b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        " using an instance of " +
465b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                        obj.getClass().getName()));
466bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        }
467bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson
468b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final boolean compareAndSet(T obj, int expect, int update) {
469b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            accessCheck(obj);
470b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return U.compareAndSwapInt(obj, offset, expect, update);
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
473b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final boolean weakCompareAndSet(T obj, int expect, int update) {
474b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            accessCheck(obj);
475b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return U.compareAndSwapInt(obj, offset, expect, update);
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
478b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final void set(T obj, int newValue) {
479b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            accessCheck(obj);
480b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            U.putIntVolatile(obj, offset, newValue);
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
483b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final void lazySet(T obj, int newValue) {
484b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            accessCheck(obj);
485b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            U.putOrderedInt(obj, offset, newValue);
4866232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson        }
4876232a5efed0ea103e35aec73206e5e03a8b82e0cJesse Wilson
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public final int get(T obj) {
489b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            accessCheck(obj);
490b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return U.getIntVolatile(obj, offset);
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
492bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson
493b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final int getAndSet(T obj, int newValue) {
494b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            accessCheck(obj);
495b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return U.getAndSetInt(obj, offset, newValue);
496b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
497b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
498b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final int getAndAdd(T obj, int delta) {
499b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            accessCheck(obj);
500b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return U.getAndAddInt(obj, offset, delta);
501b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
502b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
503b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final int getAndIncrement(T obj) {
504b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return getAndAdd(obj, 1);
505b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
506b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
507b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final int getAndDecrement(T obj) {
508b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return getAndAdd(obj, -1);
5095328e07d282bef36ac8b757bbee16a761415b2c4Przemyslaw Szczepaniak        }
510b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
511b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final int incrementAndGet(T obj) {
512b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return getAndAdd(obj, 1) + 1;
513b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
514b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
515b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final int decrementAndGet(T obj) {
516b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return getAndAdd(obj, -1) - 1;
517b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
518b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
519b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public final int addAndGet(T obj, int delta) {
520b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return getAndAdd(obj, delta) + delta;
521b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
522b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
525