1 /*
2 * Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.internal.misc;
27
28 import jdk.internal.ref.Cleaner;
29 import jdk.internal.vm.annotation.ForceInline;
30 import jdk.internal.vm.annotation.IntrinsicCandidate;
31 import sun.nio.ch.DirectBuffer;
32
33 import java.lang.reflect.Field;
34 import java.security.ProtectionDomain;
35
36 import static jdk.internal.misc.UnsafeConstants.*;
37
38 /**
39 * A collection of methods for performing low-level, unsafe operations.
40 * Although the class and all methods are public, use of this class is
41 * limited because only trusted code can obtain instances of it.
42 *
43 * <em>Note:</em> It is the responsibility of the caller to make sure
44 * arguments are checked before methods of this class are
45 * called. While some rudimentary checks are performed on the input,
46 * the checks are best effort and when performance is an overriding
47 * priority, as when methods of this class are optimized by the
48 * runtime compiler, some or all checks (if any) may be elided. Hence,
160 * The first two parameters are interpreted exactly as with
161 * {@link #getInt(Object, long)} to refer to a specific
162 * Java variable (field or array element). The given value
163 * is stored into that variable.
164 * <p>
165 * The variable must be of the same type as the method
166 * parameter {@code x}.
167 *
168 * @param o Java heap object in which the variable resides, if any, else
169 * null
170 * @param offset indication of where the variable resides in a Java heap
171 * object, if any, else a memory address locating the variable
172 * statically
173 * @param x the value to store into the indicated Java variable
174 * @throws RuntimeException No defined exceptions are thrown, not even
175 * {@link NullPointerException}
176 */
177 @IntrinsicCandidate
178 public native void putInt(Object o, long offset, int x);
179
180 /**
181 * Fetches a reference value from a given Java variable.
182 * @see #getInt(Object, long)
183 */
184 @IntrinsicCandidate
185 public native Object getReference(Object o, long offset);
186
187 /**
188 * Stores a reference value into a given Java variable.
189 * <p>
190 * Unless the reference {@code x} being stored is either null
191 * or matches the field type, the results are undefined.
192 * If the reference {@code o} is non-null, card marks or
193 * other store barriers for that object (if the VM requires them)
194 * are updated.
195 * @see #putInt(Object, long, int)
196 */
197 @IntrinsicCandidate
198 public native void putReference(Object o, long offset, Object x);
199
200 /** @see #getInt(Object, long) */
201 @IntrinsicCandidate
202 public native boolean getBoolean(Object o, long offset);
203
204 /** @see #putInt(Object, long, int) */
205 @IntrinsicCandidate
206 public native void putBoolean(Object o, long offset, boolean x);
207
208 /** @see #getInt(Object, long) */
209 @IntrinsicCandidate
210 public native byte getByte(Object o, long offset);
211
212 /** @see #putInt(Object, long, int) */
213 @IntrinsicCandidate
214 public native void putByte(Object o, long offset, byte x);
215
216 /** @see #getInt(Object, long) */
217 @IntrinsicCandidate
218 public native short getShort(Object o, long offset);
219
1217
1218 /**
1219 * Reports the scale factor for addressing elements in the storage
1220 * allocation of a given array class. However, arrays of "narrow" types
1221 * will generally not work properly with accessors like {@link
1222 * #getByte(Object, long)}, so the scale factor for such classes is reported
1223 * as zero.
1224 *
1225 * @see #arrayBaseOffset
1226 * @see #getInt(Object, long)
1227 * @see #putInt(Object, long, int)
1228 */
1229 public int arrayIndexScale(Class<?> arrayClass) {
1230 if (arrayClass == null) {
1231 throw new NullPointerException();
1232 }
1233
1234 return arrayIndexScale0(arrayClass);
1235 }
1236
1237
1238 /** The value of {@code arrayIndexScale(boolean[].class)} */
1239 public static final int ARRAY_BOOLEAN_INDEX_SCALE
1240 = theUnsafe.arrayIndexScale(boolean[].class);
1241
1242 /** The value of {@code arrayIndexScale(byte[].class)} */
1243 public static final int ARRAY_BYTE_INDEX_SCALE
1244 = theUnsafe.arrayIndexScale(byte[].class);
1245
1246 /** The value of {@code arrayIndexScale(short[].class)} */
1247 public static final int ARRAY_SHORT_INDEX_SCALE
1248 = theUnsafe.arrayIndexScale(short[].class);
1249
1250 /** The value of {@code arrayIndexScale(char[].class)} */
1251 public static final int ARRAY_CHAR_INDEX_SCALE
1252 = theUnsafe.arrayIndexScale(char[].class);
1253
1254 /** The value of {@code arrayIndexScale(int[].class)} */
1255 public static final int ARRAY_INT_INDEX_SCALE
1256 = theUnsafe.arrayIndexScale(int[].class);
1395 return null;
1396 }
1397
1398 /** Throws the exception without telling the verifier. */
1399 public native void throwException(Throwable ee);
1400
1401 /**
1402 * Atomically updates Java variable to {@code x} if it is currently
1403 * holding {@code expected}.
1404 *
1405 * <p>This operation has memory semantics of a {@code volatile} read
1406 * and write. Corresponds to C11 atomic_compare_exchange_strong.
1407 *
1408 * @return {@code true} if successful
1409 */
1410 @IntrinsicCandidate
1411 public final native boolean compareAndSetReference(Object o, long offset,
1412 Object expected,
1413 Object x);
1414
1415 @IntrinsicCandidate
1416 public final native Object compareAndExchangeReference(Object o, long offset,
1417 Object expected,
1418 Object x);
1419
1420 @IntrinsicCandidate
1421 public final Object compareAndExchangeReferenceAcquire(Object o, long offset,
1422 Object expected,
1423 Object x) {
1424 return compareAndExchangeReference(o, offset, expected, x);
1425 }
1426
1427 @IntrinsicCandidate
1428 public final Object compareAndExchangeReferenceRelease(Object o, long offset,
1429 Object expected,
1430 Object x) {
1431 return compareAndExchangeReference(o, offset, expected, x);
1432 }
1433
1434 @IntrinsicCandidate
1435 public final boolean weakCompareAndSetReferencePlain(Object o, long offset,
1436 Object expected,
1437 Object x) {
1438 return compareAndSetReference(o, offset, expected, x);
1439 }
1440
1441 @IntrinsicCandidate
1442 public final boolean weakCompareAndSetReferenceAcquire(Object o, long offset,
1443 Object expected,
1444 Object x) {
1445 return compareAndSetReference(o, offset, expected, x);
1446 }
1447
1448 @IntrinsicCandidate
1449 public final boolean weakCompareAndSetReferenceRelease(Object o, long offset,
1450 Object expected,
1451 Object x) {
1452 return compareAndSetReference(o, offset, expected, x);
1453 }
1454
1455 @IntrinsicCandidate
1456 public final boolean weakCompareAndSetReference(Object o, long offset,
1457 Object expected,
1458 Object x) {
1459 return compareAndSetReference(o, offset, expected, x);
1460 }
1461
1462 /**
1463 * Atomically updates Java variable to {@code x} if it is currently
1464 * holding {@code expected}.
1465 *
1466 * <p>This operation has memory semantics of a {@code volatile} read
1467 * and write. Corresponds to C11 atomic_compare_exchange_strong.
1468 *
1469 * @return {@code true} if successful
1470 */
1471 @IntrinsicCandidate
1472 public final native boolean compareAndSetInt(Object o, long offset,
1473 int expected,
1474 int x);
1475
1476 @IntrinsicCandidate
1477 public final native int compareAndExchangeInt(Object o, long offset,
1478 int expected,
1479 int x);
1480
1481 @IntrinsicCandidate
2057 public final boolean weakCompareAndSetLongRelease(Object o, long offset,
2058 long expected,
2059 long x) {
2060 return compareAndSetLong(o, offset, expected, x);
2061 }
2062
2063 @IntrinsicCandidate
2064 public final boolean weakCompareAndSetLong(Object o, long offset,
2065 long expected,
2066 long x) {
2067 return compareAndSetLong(o, offset, expected, x);
2068 }
2069
2070 /**
2071 * Fetches a reference value from a given Java variable, with volatile
2072 * load semantics. Otherwise identical to {@link #getReference(Object, long)}
2073 */
2074 @IntrinsicCandidate
2075 public native Object getReferenceVolatile(Object o, long offset);
2076
2077 /**
2078 * Stores a reference value into a given Java variable, with
2079 * volatile store semantics. Otherwise identical to {@link #putReference(Object, long, Object)}
2080 */
2081 @IntrinsicCandidate
2082 public native void putReferenceVolatile(Object o, long offset, Object x);
2083
2084 /** Volatile version of {@link #getInt(Object, long)} */
2085 @IntrinsicCandidate
2086 public native int getIntVolatile(Object o, long offset);
2087
2088 /** Volatile version of {@link #putInt(Object, long, int)} */
2089 @IntrinsicCandidate
2090 public native void putIntVolatile(Object o, long offset, int x);
2091
2092 /** Volatile version of {@link #getBoolean(Object, long)} */
2093 @IntrinsicCandidate
2094 public native boolean getBooleanVolatile(Object o, long offset);
2095
2096 /** Volatile version of {@link #putBoolean(Object, long, boolean)} */
2097 @IntrinsicCandidate
2098 public native void putBooleanVolatile(Object o, long offset, boolean x);
2099
2100 /** Volatile version of {@link #getByte(Object, long)} */
2101 @IntrinsicCandidate
2102 public native byte getByteVolatile(Object o, long offset);
2103
2136 /** Volatile version of {@link #putFloat(Object, long, float)} */
2137 @IntrinsicCandidate
2138 public native void putFloatVolatile(Object o, long offset, float x);
2139
2140 /** Volatile version of {@link #getDouble(Object, long)} */
2141 @IntrinsicCandidate
2142 public native double getDoubleVolatile(Object o, long offset);
2143
2144 /** Volatile version of {@link #putDouble(Object, long, double)} */
2145 @IntrinsicCandidate
2146 public native void putDoubleVolatile(Object o, long offset, double x);
2147
2148
2149
2150 /** Acquire version of {@link #getReferenceVolatile(Object, long)} */
2151 @IntrinsicCandidate
2152 public final Object getReferenceAcquire(Object o, long offset) {
2153 return getReferenceVolatile(o, offset);
2154 }
2155
2156 /** Acquire version of {@link #getBooleanVolatile(Object, long)} */
2157 @IntrinsicCandidate
2158 public final boolean getBooleanAcquire(Object o, long offset) {
2159 return getBooleanVolatile(o, offset);
2160 }
2161
2162 /** Acquire version of {@link #getByteVolatile(Object, long)} */
2163 @IntrinsicCandidate
2164 public final byte getByteAcquire(Object o, long offset) {
2165 return getByteVolatile(o, offset);
2166 }
2167
2168 /** Acquire version of {@link #getShortVolatile(Object, long)} */
2169 @IntrinsicCandidate
2170 public final short getShortAcquire(Object o, long offset) {
2171 return getShortVolatile(o, offset);
2172 }
2173
2174 /** Acquire version of {@link #getCharVolatile(Object, long)} */
2175 @IntrinsicCandidate
2200 public final double getDoubleAcquire(Object o, long offset) {
2201 return getDoubleVolatile(o, offset);
2202 }
2203
2204 /*
2205 * Versions of {@link #putReferenceVolatile(Object, long, Object)}
2206 * that do not guarantee immediate visibility of the store to
2207 * other threads. This method is generally only useful if the
2208 * underlying field is a Java volatile (or if an array cell, one
2209 * that is otherwise only accessed using volatile accesses).
2210 *
2211 * Corresponds to C11 atomic_store_explicit(..., memory_order_release).
2212 */
2213
2214 /** Release version of {@link #putReferenceVolatile(Object, long, Object)} */
2215 @IntrinsicCandidate
2216 public final void putReferenceRelease(Object o, long offset, Object x) {
2217 putReferenceVolatile(o, offset, x);
2218 }
2219
2220 /** Release version of {@link #putBooleanVolatile(Object, long, boolean)} */
2221 @IntrinsicCandidate
2222 public final void putBooleanRelease(Object o, long offset, boolean x) {
2223 putBooleanVolatile(o, offset, x);
2224 }
2225
2226 /** Release version of {@link #putByteVolatile(Object, long, byte)} */
2227 @IntrinsicCandidate
2228 public final void putByteRelease(Object o, long offset, byte x) {
2229 putByteVolatile(o, offset, x);
2230 }
2231
2232 /** Release version of {@link #putShortVolatile(Object, long, short)} */
2233 @IntrinsicCandidate
2234 public final void putShortRelease(Object o, long offset, short x) {
2235 putShortVolatile(o, offset, x);
2236 }
2237
2238 /** Release version of {@link #putCharVolatile(Object, long, char)} */
2239 @IntrinsicCandidate
2256 /** Release version of {@link #putLongVolatile(Object, long, long)} */
2257 @IntrinsicCandidate
2258 public final void putLongRelease(Object o, long offset, long x) {
2259 putLongVolatile(o, offset, x);
2260 }
2261
2262 /** Release version of {@link #putDoubleVolatile(Object, long, double)} */
2263 @IntrinsicCandidate
2264 public final void putDoubleRelease(Object o, long offset, double x) {
2265 putDoubleVolatile(o, offset, x);
2266 }
2267
2268 // ------------------------------ Opaque --------------------------------------
2269
2270 /** Opaque version of {@link #getReferenceVolatile(Object, long)} */
2271 @IntrinsicCandidate
2272 public final Object getReferenceOpaque(Object o, long offset) {
2273 return getReferenceVolatile(o, offset);
2274 }
2275
2276 /** Opaque version of {@link #getBooleanVolatile(Object, long)} */
2277 @IntrinsicCandidate
2278 public final boolean getBooleanOpaque(Object o, long offset) {
2279 return getBooleanVolatile(o, offset);
2280 }
2281
2282 /** Opaque version of {@link #getByteVolatile(Object, long)} */
2283 @IntrinsicCandidate
2284 public final byte getByteOpaque(Object o, long offset) {
2285 return getByteVolatile(o, offset);
2286 }
2287
2288 /** Opaque version of {@link #getShortVolatile(Object, long)} */
2289 @IntrinsicCandidate
2290 public final short getShortOpaque(Object o, long offset) {
2291 return getShortVolatile(o, offset);
2292 }
2293
2294 /** Opaque version of {@link #getCharVolatile(Object, long)} */
2295 @IntrinsicCandidate
2310 }
2311
2312 /** Opaque version of {@link #getLongVolatile(Object, long)} */
2313 @IntrinsicCandidate
2314 public final long getLongOpaque(Object o, long offset) {
2315 return getLongVolatile(o, offset);
2316 }
2317
2318 /** Opaque version of {@link #getDoubleVolatile(Object, long)} */
2319 @IntrinsicCandidate
2320 public final double getDoubleOpaque(Object o, long offset) {
2321 return getDoubleVolatile(o, offset);
2322 }
2323
2324 /** Opaque version of {@link #putReferenceVolatile(Object, long, Object)} */
2325 @IntrinsicCandidate
2326 public final void putReferenceOpaque(Object o, long offset, Object x) {
2327 putReferenceVolatile(o, offset, x);
2328 }
2329
2330 /** Opaque version of {@link #putBooleanVolatile(Object, long, boolean)} */
2331 @IntrinsicCandidate
2332 public final void putBooleanOpaque(Object o, long offset, boolean x) {
2333 putBooleanVolatile(o, offset, x);
2334 }
2335
2336 /** Opaque version of {@link #putByteVolatile(Object, long, byte)} */
2337 @IntrinsicCandidate
2338 public final void putByteOpaque(Object o, long offset, byte x) {
2339 putByteVolatile(o, offset, x);
2340 }
2341
2342 /** Opaque version of {@link #putShortVolatile(Object, long, short)} */
2343 @IntrinsicCandidate
2344 public final void putShortOpaque(Object o, long offset, short x) {
2345 putShortVolatile(o, offset, x);
2346 }
2347
2348 /** Opaque version of {@link #putCharVolatile(Object, long, char)} */
2349 @IntrinsicCandidate
2744 /**
2745 * Atomically exchanges the given reference value with the current
2746 * reference value of a field or array element within the given
2747 * object {@code o} at the given {@code offset}.
2748 *
2749 * @param o object/array to update the field/element in
2750 * @param offset field/element offset
2751 * @param newValue new value
2752 * @return the previous value
2753 * @since 1.8
2754 */
2755 @IntrinsicCandidate
2756 public final Object getAndSetReference(Object o, long offset, Object newValue) {
2757 Object v;
2758 do {
2759 v = getReferenceVolatile(o, offset);
2760 } while (!weakCompareAndSetReference(o, offset, v, newValue));
2761 return v;
2762 }
2763
2764 @ForceInline
2765 public final Object getAndSetReferenceRelease(Object o, long offset, Object newValue) {
2766 Object v;
2767 do {
2768 v = getReference(o, offset);
2769 } while (!weakCompareAndSetReferenceRelease(o, offset, v, newValue));
2770 return v;
2771 }
2772
2773 @ForceInline
2774 public final Object getAndSetReferenceAcquire(Object o, long offset, Object newValue) {
2775 Object v;
2776 do {
2777 v = getReferenceAcquire(o, offset);
2778 } while (!weakCompareAndSetReferenceAcquire(o, offset, v, newValue));
2779 return v;
2780 }
2781
2782 @IntrinsicCandidate
2783 public final byte getAndSetByte(Object o, long offset, byte newValue) {
2784 byte v;
2785 do {
2786 v = getByteVolatile(o, offset);
2787 } while (!weakCompareAndSetByte(o, offset, v, newValue));
2788 return v;
2789 }
2790
2791 @ForceInline
2792 public final byte getAndSetByteRelease(Object o, long offset, byte newValue) {
2793 byte v;
2794 do {
2795 v = getByte(o, offset);
2796 } while (!weakCompareAndSetByteRelease(o, offset, v, newValue));
2797 return v;
2798 }
2799
2800 @ForceInline
2801 public final byte getAndSetByteAcquire(Object o, long offset, byte newValue) {
3818 private static int convEndian(boolean big, int n) { return big == BIG_ENDIAN ? n : Integer.reverseBytes(n) ; }
3819 private static long convEndian(boolean big, long n) { return big == BIG_ENDIAN ? n : Long.reverseBytes(n) ; }
3820
3821
3822
3823 private native long allocateMemory0(long bytes);
3824 private native long reallocateMemory0(long address, long bytes);
3825 private native void freeMemory0(long address);
3826 private native void setMemory0(Object o, long offset, long bytes, byte value);
3827 @IntrinsicCandidate
3828 private native void copyMemory0(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes);
3829 private native void copySwapMemory0(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes, long elemSize);
3830 private native long objectFieldOffset0(Field f);
3831 private native long objectFieldOffset1(Class<?> c, String name);
3832 private native long staticFieldOffset0(Field f);
3833 private native Object staticFieldBase0(Field f);
3834 private native boolean shouldBeInitialized0(Class<?> c);
3835 private native void ensureClassInitialized0(Class<?> c);
3836 private native int arrayBaseOffset0(Class<?> arrayClass);
3837 private native int arrayIndexScale0(Class<?> arrayClass);
3838 private native int getLoadAverage0(double[] loadavg, int nelems);
3839
3840
3841 /**
3842 * Invokes the given direct byte buffer's cleaner, if any.
3843 *
3844 * @param directBuffer a direct byte buffer
3845 * @throws NullPointerException if {@code directBuffer} is null
3846 * @throws IllegalArgumentException if {@code directBuffer} is non-direct,
3847 * or is a {@link java.nio.Buffer#slice slice}, or is a
3848 * {@link java.nio.Buffer#duplicate duplicate}
3849 */
3850 public void invokeCleaner(java.nio.ByteBuffer directBuffer) {
3851 if (!directBuffer.isDirect())
3852 throw new IllegalArgumentException("buffer is non-direct");
3853
3854 DirectBuffer db = (DirectBuffer) directBuffer;
3855 if (db.attachment() != null)
3856 throw new IllegalArgumentException("duplicate or slice");
3857
|
1 /*
2 * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.internal.misc;
27
28 import jdk.internal.ref.Cleaner;
29 import jdk.internal.value.PrimitiveClass;
30 import jdk.internal.vm.annotation.ForceInline;
31 import jdk.internal.vm.annotation.IntrinsicCandidate;
32 import sun.nio.ch.DirectBuffer;
33
34 import java.lang.reflect.Field;
35 import java.security.ProtectionDomain;
36
37 import static jdk.internal.misc.UnsafeConstants.*;
38
39 /**
40 * A collection of methods for performing low-level, unsafe operations.
41 * Although the class and all methods are public, use of this class is
42 * limited because only trusted code can obtain instances of it.
43 *
44 * <em>Note:</em> It is the responsibility of the caller to make sure
45 * arguments are checked before methods of this class are
46 * called. While some rudimentary checks are performed on the input,
47 * the checks are best effort and when performance is an overriding
48 * priority, as when methods of this class are optimized by the
49 * runtime compiler, some or all checks (if any) may be elided. Hence,
161 * The first two parameters are interpreted exactly as with
162 * {@link #getInt(Object, long)} to refer to a specific
163 * Java variable (field or array element). The given value
164 * is stored into that variable.
165 * <p>
166 * The variable must be of the same type as the method
167 * parameter {@code x}.
168 *
169 * @param o Java heap object in which the variable resides, if any, else
170 * null
171 * @param offset indication of where the variable resides in a Java heap
172 * object, if any, else a memory address locating the variable
173 * statically
174 * @param x the value to store into the indicated Java variable
175 * @throws RuntimeException No defined exceptions are thrown, not even
176 * {@link NullPointerException}
177 */
178 @IntrinsicCandidate
179 public native void putInt(Object o, long offset, int x);
180
181
182 /**
183 * Returns true if the given field is flattened.
184 */
185 public boolean isFlattened(Field f) {
186 if (f == null) {
187 throw new NullPointerException();
188 }
189 return isFlattenedField0(f);
190 }
191
192 private native boolean isFlattenedField0(Object o);
193
194 /**
195 * Returns true if the given class is a flattened array.
196 */
197 public native boolean isFlattenedArray(Class<?> arrayClass);
198
199 /**
200 * Fetches a reference value from a given Java variable.
201 * This method can return a reference to either an object or value
202 * or a null reference.
203 *
204 * @see #getInt(Object, long)
205 */
206 @IntrinsicCandidate
207 public native Object getReference(Object o, long offset);
208
209 /**
210 * Stores a reference value into a given Java variable.
211 * This method can store a reference to either an object or value
212 * or a null reference.
213 * <p>
214 * Unless the reference {@code x} being stored is either null
215 * or matches the field type, the results are undefined.
216 * If the reference {@code o} is non-null, card marks or
217 * other store barriers for that object (if the VM requires them)
218 * are updated.
219 * @see #putInt(Object, long, int)
220 */
221 @IntrinsicCandidate
222 public native void putReference(Object o, long offset, Object x);
223
224 /**
225 * Fetches a value of type {@code <V>} from a given Java variable.
226 * More specifically, fetches a field or array element within the given
227 * {@code o} object at the given offset, or (if {@code o} is null)
228 * from the memory address whose numerical value is the given offset.
229 *
230 * @param o Java heap object in which the variable resides, if any, else
231 * null
232 * @param offset indication of where the variable resides in a Java heap
233 * object, if any, else a memory address locating the variable
234 * statically
235 * @param valueType value type
236 * @param <V> the type of a value
237 * @return the value fetched from the indicated Java variable
238 * @throws RuntimeException No defined exceptions are thrown, not even
239 * {@link NullPointerException}
240 */
241 @IntrinsicCandidate
242 public native <V> V getValue(Object o, long offset, Class<?> valueType);
243
244 /**
245 * Stores the given value into a given Java variable.
246 *
247 * Unless the reference {@code o} being stored is either null
248 * or matches the field type, the results are undefined.
249 *
250 * @param o Java heap object in which the variable resides, if any, else
251 * null
252 * @param offset indication of where the variable resides in a Java heap
253 * object, if any, else a memory address locating the variable
254 * statically
255 * @param valueType value type
256 * @param v the value to store into the indicated Java variable
257 * @param <V> the type of a value
258 * @throws RuntimeException No defined exceptions are thrown, not even
259 * {@link NullPointerException}
260 */
261 @IntrinsicCandidate
262 public native <V> void putValue(Object o, long offset, Class<?> valueType, V v);
263
264 /**
265 * Fetches a reference value of the given type from a given Java variable.
266 * This method can return a reference to a value if it is non-null.
267 * If the value is null, this method returns a default value for
268 * primitive value types or null for identity classes and value classes.
269 *
270 * @param type type
271 */
272 public Object getReference(Object o, long offset, Class<?> type) {
273 Object ref = getReference(o, offset);
274 if (ref == null && PrimitiveClass.isPrimitiveValueType(type)) {
275 // If the type of the returned reference is a primitive value type,
276 // return an uninitialized default value if null
277 ref = uninitializedDefaultValue(type);
278 }
279 return ref;
280 }
281
282 public Object getReferenceVolatile(Object o, long offset, Class<?> type) {
283 Object ref = getReferenceVolatile(o, offset);
284 if (ref == null && PrimitiveClass.isPrimitiveValueType(type)) {
285 // If the type of the returned reference is a primitive value type,
286 // return an uninitialized default value if null
287 ref = uninitializedDefaultValue(type);
288 }
289 return ref;
290 }
291
292 /**
293 * Returns an uninitialized default value of the given value type.
294 */
295 public native <V> V uninitializedDefaultValue(Class<?> type);
296
297 /**
298 * Returns an object instance with a private buffered value whose layout
299 * and contents is exactly the given value instance. The return object
300 * is in the larval state that can be updated using the unsafe put operation.
301 *
302 * @param value a value instance
303 * @param <V> the type of the given value instance
304 */
305 @IntrinsicCandidate
306 public native <V> V makePrivateBuffer(V value);
307
308 /**
309 * Exits the larval state and returns a value instance.
310 *
311 * @param value a value instance
312 * @param <V> the type of the given value instance
313 */
314 @IntrinsicCandidate
315 public native <V> V finishPrivateBuffer(V value);
316
317 /**
318 * Returns the header size of the given value type.
319 *
320 * @param valueType value type
321 * @return the header size of the value type
322 */
323 public native <V> long valueHeaderSize(Class<V> valueType);
324
325 /** @see #getInt(Object, long) */
326 @IntrinsicCandidate
327 public native boolean getBoolean(Object o, long offset);
328
329 /** @see #putInt(Object, long, int) */
330 @IntrinsicCandidate
331 public native void putBoolean(Object o, long offset, boolean x);
332
333 /** @see #getInt(Object, long) */
334 @IntrinsicCandidate
335 public native byte getByte(Object o, long offset);
336
337 /** @see #putInt(Object, long, int) */
338 @IntrinsicCandidate
339 public native void putByte(Object o, long offset, byte x);
340
341 /** @see #getInt(Object, long) */
342 @IntrinsicCandidate
343 public native short getShort(Object o, long offset);
344
1342
1343 /**
1344 * Reports the scale factor for addressing elements in the storage
1345 * allocation of a given array class. However, arrays of "narrow" types
1346 * will generally not work properly with accessors like {@link
1347 * #getByte(Object, long)}, so the scale factor for such classes is reported
1348 * as zero.
1349 *
1350 * @see #arrayBaseOffset
1351 * @see #getInt(Object, long)
1352 * @see #putInt(Object, long, int)
1353 */
1354 public int arrayIndexScale(Class<?> arrayClass) {
1355 if (arrayClass == null) {
1356 throw new NullPointerException();
1357 }
1358
1359 return arrayIndexScale0(arrayClass);
1360 }
1361
1362 /**
1363 * Return the size of the object in the heap.
1364 * @param o an object
1365 * @return the objects's size
1366 * @since Valhalla
1367 */
1368 public long getObjectSize(Object o) {
1369 if (o == null)
1370 throw new NullPointerException();
1371 return getObjectSize0(o);
1372 }
1373
1374 /** The value of {@code arrayIndexScale(boolean[].class)} */
1375 public static final int ARRAY_BOOLEAN_INDEX_SCALE
1376 = theUnsafe.arrayIndexScale(boolean[].class);
1377
1378 /** The value of {@code arrayIndexScale(byte[].class)} */
1379 public static final int ARRAY_BYTE_INDEX_SCALE
1380 = theUnsafe.arrayIndexScale(byte[].class);
1381
1382 /** The value of {@code arrayIndexScale(short[].class)} */
1383 public static final int ARRAY_SHORT_INDEX_SCALE
1384 = theUnsafe.arrayIndexScale(short[].class);
1385
1386 /** The value of {@code arrayIndexScale(char[].class)} */
1387 public static final int ARRAY_CHAR_INDEX_SCALE
1388 = theUnsafe.arrayIndexScale(char[].class);
1389
1390 /** The value of {@code arrayIndexScale(int[].class)} */
1391 public static final int ARRAY_INT_INDEX_SCALE
1392 = theUnsafe.arrayIndexScale(int[].class);
1531 return null;
1532 }
1533
1534 /** Throws the exception without telling the verifier. */
1535 public native void throwException(Throwable ee);
1536
1537 /**
1538 * Atomically updates Java variable to {@code x} if it is currently
1539 * holding {@code expected}.
1540 *
1541 * <p>This operation has memory semantics of a {@code volatile} read
1542 * and write. Corresponds to C11 atomic_compare_exchange_strong.
1543 *
1544 * @return {@code true} if successful
1545 */
1546 @IntrinsicCandidate
1547 public final native boolean compareAndSetReference(Object o, long offset,
1548 Object expected,
1549 Object x);
1550
1551 private final boolean isValueObject(Object o) {
1552 return o != null && o.getClass().isValue();
1553 }
1554
1555 /*
1556 * For primitive type, CAS should do substitutability test as opposed
1557 * to two pointers comparison.
1558 *
1559 * Perhaps we can keep the xxxObject methods for compatibility and
1560 * change the JDK 13 xxxReference method signature freely.
1561 */
1562 public final <V> boolean compareAndSetReference(Object o, long offset,
1563 Class<?> type,
1564 V expected,
1565 V x) {
1566 if (type.isValue() || isValueObject(expected)) {
1567 synchronized (valueLock) {
1568 Object witness = getReference(o, offset);
1569 if (witness == expected) {
1570 putReference(o, offset, x);
1571 return true;
1572 } else {
1573 return false;
1574 }
1575 }
1576 } else {
1577 return compareAndSetReference(o, offset, expected, x);
1578 }
1579 }
1580
1581 @ForceInline
1582 public final <V> boolean compareAndSetValue(Object o, long offset,
1583 Class<?> valueType,
1584 V expected,
1585 V x) {
1586 synchronized (valueLock) {
1587 Object witness = getValue(o, offset, valueType);
1588 if (witness == expected) {
1589 putValue(o, offset, valueType, x);
1590 return true;
1591 }
1592 else {
1593 return false;
1594 }
1595 }
1596 }
1597
1598 @IntrinsicCandidate
1599 public final native Object compareAndExchangeReference(Object o, long offset,
1600 Object expected,
1601 Object x);
1602
1603 public final <V> Object compareAndExchangeReference(Object o, long offset,
1604 Class<?> valueType,
1605 V expected,
1606 V x) {
1607 if (valueType.isValue() || isValueObject(expected)) {
1608 synchronized (valueLock) {
1609 Object witness = getReference(o, offset);
1610 if (witness == expected) {
1611 putReference(o, offset, x);
1612 }
1613 return witness;
1614 }
1615 } else {
1616 return compareAndExchangeReference(o, offset, expected, x);
1617 }
1618 }
1619
1620 @ForceInline
1621 public final <V> Object compareAndExchangeValue(Object o, long offset,
1622 Class<?> valueType,
1623 V expected,
1624 V x) {
1625 synchronized (valueLock) {
1626 Object witness = getValue(o, offset, valueType);
1627 if (witness == expected) {
1628 putValue(o, offset, valueType, x);
1629 }
1630 return witness;
1631 }
1632 }
1633
1634 @IntrinsicCandidate
1635 public final Object compareAndExchangeReferenceAcquire(Object o, long offset,
1636 Object expected,
1637 Object x) {
1638 return compareAndExchangeReference(o, offset, expected, x);
1639 }
1640
1641 public final <V> Object compareAndExchangeReferenceAcquire(Object o, long offset,
1642 Class<?> valueType,
1643 V expected,
1644 V x) {
1645 return compareAndExchangeReference(o, offset, valueType, expected, x);
1646 }
1647
1648 @ForceInline
1649 public final <V> Object compareAndExchangeValueAcquire(Object o, long offset,
1650 Class<?> valueType,
1651 V expected,
1652 V x) {
1653 return compareAndExchangeValue(o, offset, valueType, expected, x);
1654 }
1655
1656 @IntrinsicCandidate
1657 public final Object compareAndExchangeReferenceRelease(Object o, long offset,
1658 Object expected,
1659 Object x) {
1660 return compareAndExchangeReference(o, offset, expected, x);
1661 }
1662
1663 public final <V> Object compareAndExchangeReferenceRelease(Object o, long offset,
1664 Class<?> valueType,
1665 V expected,
1666 V x) {
1667 return compareAndExchangeReference(o, offset, valueType, expected, x);
1668 }
1669
1670 @ForceInline
1671 public final <V> Object compareAndExchangeValueRelease(Object o, long offset,
1672 Class<?> valueType,
1673 V expected,
1674 V x) {
1675 return compareAndExchangeValue(o, offset, valueType, expected, x);
1676 }
1677
1678 @IntrinsicCandidate
1679 public final boolean weakCompareAndSetReferencePlain(Object o, long offset,
1680 Object expected,
1681 Object x) {
1682 return compareAndSetReference(o, offset, expected, x);
1683 }
1684
1685 public final <V> boolean weakCompareAndSetReferencePlain(Object o, long offset,
1686 Class<?> valueType,
1687 V expected,
1688 V x) {
1689 if (valueType.isValue() || isValueObject(expected)) {
1690 return compareAndSetReference(o, offset, valueType, expected, x);
1691 } else {
1692 return weakCompareAndSetReferencePlain(o, offset, expected, x);
1693 }
1694 }
1695
1696 @ForceInline
1697 public final <V> boolean weakCompareAndSetValuePlain(Object o, long offset,
1698 Class<?> valueType,
1699 V expected,
1700 V x) {
1701 return compareAndSetValue(o, offset, valueType, expected, x);
1702 }
1703
1704 @IntrinsicCandidate
1705 public final boolean weakCompareAndSetReferenceAcquire(Object o, long offset,
1706 Object expected,
1707 Object x) {
1708 return compareAndSetReference(o, offset, expected, x);
1709 }
1710
1711 public final <V> boolean weakCompareAndSetReferenceAcquire(Object o, long offset,
1712 Class<?> valueType,
1713 V expected,
1714 V x) {
1715 if (valueType.isValue() || isValueObject(expected)) {
1716 return compareAndSetReference(o, offset, valueType, expected, x);
1717 } else {
1718 return weakCompareAndSetReferencePlain(o, offset, expected, x);
1719 }
1720 }
1721
1722 @ForceInline
1723 public final <V> boolean weakCompareAndSetValueAcquire(Object o, long offset,
1724 Class<?> valueType,
1725 V expected,
1726 V x) {
1727 return compareAndSetValue(o, offset, valueType, expected, x);
1728 }
1729
1730 @IntrinsicCandidate
1731 public final boolean weakCompareAndSetReferenceRelease(Object o, long offset,
1732 Object expected,
1733 Object x) {
1734 return compareAndSetReference(o, offset, expected, x);
1735 }
1736
1737 public final <V> boolean weakCompareAndSetReferenceRelease(Object o, long offset,
1738 Class<?> valueType,
1739 V expected,
1740 V x) {
1741 if (valueType.isValue() || isValueObject(expected)) {
1742 return compareAndSetReference(o, offset, valueType, expected, x);
1743 } else {
1744 return weakCompareAndSetReferencePlain(o, offset, expected, x);
1745 }
1746 }
1747
1748 @ForceInline
1749 public final <V> boolean weakCompareAndSetValueRelease(Object o, long offset,
1750 Class<?> valueType,
1751 V expected,
1752 V x) {
1753 return compareAndSetValue(o, offset, valueType, expected, x);
1754 }
1755
1756 @IntrinsicCandidate
1757 public final boolean weakCompareAndSetReference(Object o, long offset,
1758 Object expected,
1759 Object x) {
1760 return compareAndSetReference(o, offset, expected, x);
1761 }
1762
1763 public final <V> boolean weakCompareAndSetReference(Object o, long offset,
1764 Class<?> valueType,
1765 V expected,
1766 V x) {
1767 if (valueType.isValue() || isValueObject(expected)) {
1768 return compareAndSetReference(o, offset, valueType, expected, x);
1769 } else {
1770 return weakCompareAndSetReferencePlain(o, offset, expected, x);
1771 }
1772 }
1773
1774 @ForceInline
1775 public final <V> boolean weakCompareAndSetValue(Object o, long offset,
1776 Class<?> valueType,
1777 V expected,
1778 V x) {
1779 return compareAndSetValue(o, offset, valueType, expected, x);
1780 }
1781
1782 /**
1783 * Atomically updates Java variable to {@code x} if it is currently
1784 * holding {@code expected}.
1785 *
1786 * <p>This operation has memory semantics of a {@code volatile} read
1787 * and write. Corresponds to C11 atomic_compare_exchange_strong.
1788 *
1789 * @return {@code true} if successful
1790 */
1791 @IntrinsicCandidate
1792 public final native boolean compareAndSetInt(Object o, long offset,
1793 int expected,
1794 int x);
1795
1796 @IntrinsicCandidate
1797 public final native int compareAndExchangeInt(Object o, long offset,
1798 int expected,
1799 int x);
1800
1801 @IntrinsicCandidate
2377 public final boolean weakCompareAndSetLongRelease(Object o, long offset,
2378 long expected,
2379 long x) {
2380 return compareAndSetLong(o, offset, expected, x);
2381 }
2382
2383 @IntrinsicCandidate
2384 public final boolean weakCompareAndSetLong(Object o, long offset,
2385 long expected,
2386 long x) {
2387 return compareAndSetLong(o, offset, expected, x);
2388 }
2389
2390 /**
2391 * Fetches a reference value from a given Java variable, with volatile
2392 * load semantics. Otherwise identical to {@link #getReference(Object, long)}
2393 */
2394 @IntrinsicCandidate
2395 public native Object getReferenceVolatile(Object o, long offset);
2396
2397 /**
2398 * Global lock for atomic and volatile strength access to any value of
2399 * a value type. This is a temporary workaround until better localized
2400 * atomic access mechanisms are supported for value class and primitive class.
2401 */
2402 private static final Object valueLock = new Object();
2403
2404 public final <V> Object getValueVolatile(Object base, long offset, Class<?> valueType) {
2405 synchronized (valueLock) {
2406 return getValue(base, offset, valueType);
2407 }
2408 }
2409
2410 /**
2411 * Stores a reference value into a given Java variable, with
2412 * volatile store semantics. Otherwise identical to {@link #putReference(Object, long, Object)}
2413 */
2414 @IntrinsicCandidate
2415 public native void putReferenceVolatile(Object o, long offset, Object x);
2416
2417 public final <V> void putValueVolatile(Object o, long offset, Class<?> valueType, V x) {
2418 synchronized (valueLock) {
2419 putValue(o, offset, valueType, x);
2420 }
2421 }
2422
2423 /** Volatile version of {@link #getInt(Object, long)} */
2424 @IntrinsicCandidate
2425 public native int getIntVolatile(Object o, long offset);
2426
2427 /** Volatile version of {@link #putInt(Object, long, int)} */
2428 @IntrinsicCandidate
2429 public native void putIntVolatile(Object o, long offset, int x);
2430
2431 /** Volatile version of {@link #getBoolean(Object, long)} */
2432 @IntrinsicCandidate
2433 public native boolean getBooleanVolatile(Object o, long offset);
2434
2435 /** Volatile version of {@link #putBoolean(Object, long, boolean)} */
2436 @IntrinsicCandidate
2437 public native void putBooleanVolatile(Object o, long offset, boolean x);
2438
2439 /** Volatile version of {@link #getByte(Object, long)} */
2440 @IntrinsicCandidate
2441 public native byte getByteVolatile(Object o, long offset);
2442
2475 /** Volatile version of {@link #putFloat(Object, long, float)} */
2476 @IntrinsicCandidate
2477 public native void putFloatVolatile(Object o, long offset, float x);
2478
2479 /** Volatile version of {@link #getDouble(Object, long)} */
2480 @IntrinsicCandidate
2481 public native double getDoubleVolatile(Object o, long offset);
2482
2483 /** Volatile version of {@link #putDouble(Object, long, double)} */
2484 @IntrinsicCandidate
2485 public native void putDoubleVolatile(Object o, long offset, double x);
2486
2487
2488
2489 /** Acquire version of {@link #getReferenceVolatile(Object, long)} */
2490 @IntrinsicCandidate
2491 public final Object getReferenceAcquire(Object o, long offset) {
2492 return getReferenceVolatile(o, offset);
2493 }
2494
2495 public final <V> Object getValueAcquire(Object base, long offset, Class<?> valueType) {
2496 return getValueVolatile(base, offset, valueType);
2497 }
2498
2499 /** Acquire version of {@link #getBooleanVolatile(Object, long)} */
2500 @IntrinsicCandidate
2501 public final boolean getBooleanAcquire(Object o, long offset) {
2502 return getBooleanVolatile(o, offset);
2503 }
2504
2505 /** Acquire version of {@link #getByteVolatile(Object, long)} */
2506 @IntrinsicCandidate
2507 public final byte getByteAcquire(Object o, long offset) {
2508 return getByteVolatile(o, offset);
2509 }
2510
2511 /** Acquire version of {@link #getShortVolatile(Object, long)} */
2512 @IntrinsicCandidate
2513 public final short getShortAcquire(Object o, long offset) {
2514 return getShortVolatile(o, offset);
2515 }
2516
2517 /** Acquire version of {@link #getCharVolatile(Object, long)} */
2518 @IntrinsicCandidate
2543 public final double getDoubleAcquire(Object o, long offset) {
2544 return getDoubleVolatile(o, offset);
2545 }
2546
2547 /*
2548 * Versions of {@link #putReferenceVolatile(Object, long, Object)}
2549 * that do not guarantee immediate visibility of the store to
2550 * other threads. This method is generally only useful if the
2551 * underlying field is a Java volatile (or if an array cell, one
2552 * that is otherwise only accessed using volatile accesses).
2553 *
2554 * Corresponds to C11 atomic_store_explicit(..., memory_order_release).
2555 */
2556
2557 /** Release version of {@link #putReferenceVolatile(Object, long, Object)} */
2558 @IntrinsicCandidate
2559 public final void putReferenceRelease(Object o, long offset, Object x) {
2560 putReferenceVolatile(o, offset, x);
2561 }
2562
2563 public final <V> void putValueRelease(Object o, long offset, Class<?> valueType, V x) {
2564 putValueVolatile(o, offset, valueType, x);
2565 }
2566
2567 /** Release version of {@link #putBooleanVolatile(Object, long, boolean)} */
2568 @IntrinsicCandidate
2569 public final void putBooleanRelease(Object o, long offset, boolean x) {
2570 putBooleanVolatile(o, offset, x);
2571 }
2572
2573 /** Release version of {@link #putByteVolatile(Object, long, byte)} */
2574 @IntrinsicCandidate
2575 public final void putByteRelease(Object o, long offset, byte x) {
2576 putByteVolatile(o, offset, x);
2577 }
2578
2579 /** Release version of {@link #putShortVolatile(Object, long, short)} */
2580 @IntrinsicCandidate
2581 public final void putShortRelease(Object o, long offset, short x) {
2582 putShortVolatile(o, offset, x);
2583 }
2584
2585 /** Release version of {@link #putCharVolatile(Object, long, char)} */
2586 @IntrinsicCandidate
2603 /** Release version of {@link #putLongVolatile(Object, long, long)} */
2604 @IntrinsicCandidate
2605 public final void putLongRelease(Object o, long offset, long x) {
2606 putLongVolatile(o, offset, x);
2607 }
2608
2609 /** Release version of {@link #putDoubleVolatile(Object, long, double)} */
2610 @IntrinsicCandidate
2611 public final void putDoubleRelease(Object o, long offset, double x) {
2612 putDoubleVolatile(o, offset, x);
2613 }
2614
2615 // ------------------------------ Opaque --------------------------------------
2616
2617 /** Opaque version of {@link #getReferenceVolatile(Object, long)} */
2618 @IntrinsicCandidate
2619 public final Object getReferenceOpaque(Object o, long offset) {
2620 return getReferenceVolatile(o, offset);
2621 }
2622
2623 public final <V> Object getValueOpaque(Object base, long offset, Class<?> valueType) {
2624 return getValueVolatile(base, offset, valueType);
2625 }
2626
2627 /** Opaque version of {@link #getBooleanVolatile(Object, long)} */
2628 @IntrinsicCandidate
2629 public final boolean getBooleanOpaque(Object o, long offset) {
2630 return getBooleanVolatile(o, offset);
2631 }
2632
2633 /** Opaque version of {@link #getByteVolatile(Object, long)} */
2634 @IntrinsicCandidate
2635 public final byte getByteOpaque(Object o, long offset) {
2636 return getByteVolatile(o, offset);
2637 }
2638
2639 /** Opaque version of {@link #getShortVolatile(Object, long)} */
2640 @IntrinsicCandidate
2641 public final short getShortOpaque(Object o, long offset) {
2642 return getShortVolatile(o, offset);
2643 }
2644
2645 /** Opaque version of {@link #getCharVolatile(Object, long)} */
2646 @IntrinsicCandidate
2661 }
2662
2663 /** Opaque version of {@link #getLongVolatile(Object, long)} */
2664 @IntrinsicCandidate
2665 public final long getLongOpaque(Object o, long offset) {
2666 return getLongVolatile(o, offset);
2667 }
2668
2669 /** Opaque version of {@link #getDoubleVolatile(Object, long)} */
2670 @IntrinsicCandidate
2671 public final double getDoubleOpaque(Object o, long offset) {
2672 return getDoubleVolatile(o, offset);
2673 }
2674
2675 /** Opaque version of {@link #putReferenceVolatile(Object, long, Object)} */
2676 @IntrinsicCandidate
2677 public final void putReferenceOpaque(Object o, long offset, Object x) {
2678 putReferenceVolatile(o, offset, x);
2679 }
2680
2681 public final <V> void putValueOpaque(Object o, long offset, Class<?> valueType, V x) {
2682 putValueVolatile(o, offset, valueType, x);
2683 }
2684
2685 /** Opaque version of {@link #putBooleanVolatile(Object, long, boolean)} */
2686 @IntrinsicCandidate
2687 public final void putBooleanOpaque(Object o, long offset, boolean x) {
2688 putBooleanVolatile(o, offset, x);
2689 }
2690
2691 /** Opaque version of {@link #putByteVolatile(Object, long, byte)} */
2692 @IntrinsicCandidate
2693 public final void putByteOpaque(Object o, long offset, byte x) {
2694 putByteVolatile(o, offset, x);
2695 }
2696
2697 /** Opaque version of {@link #putShortVolatile(Object, long, short)} */
2698 @IntrinsicCandidate
2699 public final void putShortOpaque(Object o, long offset, short x) {
2700 putShortVolatile(o, offset, x);
2701 }
2702
2703 /** Opaque version of {@link #putCharVolatile(Object, long, char)} */
2704 @IntrinsicCandidate
3099 /**
3100 * Atomically exchanges the given reference value with the current
3101 * reference value of a field or array element within the given
3102 * object {@code o} at the given {@code offset}.
3103 *
3104 * @param o object/array to update the field/element in
3105 * @param offset field/element offset
3106 * @param newValue new value
3107 * @return the previous value
3108 * @since 1.8
3109 */
3110 @IntrinsicCandidate
3111 public final Object getAndSetReference(Object o, long offset, Object newValue) {
3112 Object v;
3113 do {
3114 v = getReferenceVolatile(o, offset);
3115 } while (!weakCompareAndSetReference(o, offset, v, newValue));
3116 return v;
3117 }
3118
3119 @SuppressWarnings("unchecked")
3120 public final <V> Object getAndSetValue(Object o, long offset, Class<?> valueType, V newValue) {
3121 synchronized (valueLock) {
3122 Object oldValue = getValue(o, offset, valueType);
3123 putValue(o, offset, valueType, newValue);
3124 return oldValue;
3125 }
3126 }
3127
3128 @ForceInline
3129 public final Object getAndSetReferenceRelease(Object o, long offset, Object newValue) {
3130 Object v;
3131 do {
3132 v = getReference(o, offset);
3133 } while (!weakCompareAndSetReferenceRelease(o, offset, v, newValue));
3134 return v;
3135 }
3136
3137 @ForceInline
3138 public final <V> Object getAndSetValueRelease(Object o, long offset, Class<?> valueType, V newValue) {
3139 return getAndSetValue(o, offset, valueType, newValue);
3140 }
3141
3142 @ForceInline
3143 public final Object getAndSetReferenceAcquire(Object o, long offset, Object newValue) {
3144 Object v;
3145 do {
3146 v = getReferenceAcquire(o, offset);
3147 } while (!weakCompareAndSetReferenceAcquire(o, offset, v, newValue));
3148 return v;
3149 }
3150
3151 @ForceInline
3152 public final <V> Object getAndSetValueAcquire(Object o, long offset, Class<?> valueType, V newValue) {
3153 return getAndSetValue(o, offset, valueType, newValue);
3154 }
3155
3156 @IntrinsicCandidate
3157 public final byte getAndSetByte(Object o, long offset, byte newValue) {
3158 byte v;
3159 do {
3160 v = getByteVolatile(o, offset);
3161 } while (!weakCompareAndSetByte(o, offset, v, newValue));
3162 return v;
3163 }
3164
3165 @ForceInline
3166 public final byte getAndSetByteRelease(Object o, long offset, byte newValue) {
3167 byte v;
3168 do {
3169 v = getByte(o, offset);
3170 } while (!weakCompareAndSetByteRelease(o, offset, v, newValue));
3171 return v;
3172 }
3173
3174 @ForceInline
3175 public final byte getAndSetByteAcquire(Object o, long offset, byte newValue) {
4192 private static int convEndian(boolean big, int n) { return big == BIG_ENDIAN ? n : Integer.reverseBytes(n) ; }
4193 private static long convEndian(boolean big, long n) { return big == BIG_ENDIAN ? n : Long.reverseBytes(n) ; }
4194
4195
4196
4197 private native long allocateMemory0(long bytes);
4198 private native long reallocateMemory0(long address, long bytes);
4199 private native void freeMemory0(long address);
4200 private native void setMemory0(Object o, long offset, long bytes, byte value);
4201 @IntrinsicCandidate
4202 private native void copyMemory0(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes);
4203 private native void copySwapMemory0(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes, long elemSize);
4204 private native long objectFieldOffset0(Field f);
4205 private native long objectFieldOffset1(Class<?> c, String name);
4206 private native long staticFieldOffset0(Field f);
4207 private native Object staticFieldBase0(Field f);
4208 private native boolean shouldBeInitialized0(Class<?> c);
4209 private native void ensureClassInitialized0(Class<?> c);
4210 private native int arrayBaseOffset0(Class<?> arrayClass);
4211 private native int arrayIndexScale0(Class<?> arrayClass);
4212 private native long getObjectSize0(Object o);
4213 private native int getLoadAverage0(double[] loadavg, int nelems);
4214
4215
4216 /**
4217 * Invokes the given direct byte buffer's cleaner, if any.
4218 *
4219 * @param directBuffer a direct byte buffer
4220 * @throws NullPointerException if {@code directBuffer} is null
4221 * @throws IllegalArgumentException if {@code directBuffer} is non-direct,
4222 * or is a {@link java.nio.Buffer#slice slice}, or is a
4223 * {@link java.nio.Buffer#duplicate duplicate}
4224 */
4225 public void invokeCleaner(java.nio.ByteBuffer directBuffer) {
4226 if (!directBuffer.isDirect())
4227 throw new IllegalArgumentException("buffer is non-direct");
4228
4229 DirectBuffer db = (DirectBuffer) directBuffer;
4230 if (db.attachment() != null)
4231 throw new IllegalArgumentException("duplicate or slice");
4232
|