1 /* 2 * Copyright (c) 2000, 2016, 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 java.lang.reflect.Field; 29 import java.security.ProtectionDomain; 30 31 import sun.reflect.CallerSensitive; 32 import sun.reflect.Reflection; 33 import jdk.internal.misc.VM; 34 35 import jdk.internal.HotSpotIntrinsicCandidate; 36 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 * @author John R. Rose 44 * @see #getUnsafe 45 */ 46 47 public final class Unsafe { 48 49 private static native void registerNatives(); 50 static { 51 registerNatives(); 52 sun.reflect.Reflection.registerMethodsToFilter(Unsafe.class, "getUnsafe"); 53 } 54 55 private Unsafe() {} 56 57 private static final Unsafe theUnsafe = new Unsafe(); 58 59 /** 60 * Provides the caller with the capability of performing unsafe 61 * operations. 62 * 63 * <p>The returned {@code Unsafe} object should be carefully guarded 64 * by the caller, since it can be used to read and write data at arbitrary 65 * memory addresses. It must never be passed to untrusted code. 66 * 67 * <p>Most methods in this class are very low-level, and correspond to a 68 * small number of hardware instructions (on typical machines). Compilers 69 * are encouraged to optimize these methods accordingly. 70 * 71 * <p>Here is a suggested idiom for using unsafe operations: 72 * 73 * <pre> {@code 74 * class MyTrustedClass { 75 * private static final Unsafe unsafe = Unsafe.getUnsafe(); 76 * ... 77 * private long myCountAddress = ...; 78 * public int getCount() { return unsafe.getByte(myCountAddress); } 79 * }}</pre> 80 * 81 * (It may assist compilers to make the local variable {@code final}.) 82 * 83 * @throws SecurityException if a security manager exists and its 84 * {@code checkPropertiesAccess} method doesn't allow 85 * access to the system properties. 86 */ 87 @CallerSensitive 88 public static Unsafe getUnsafe() { 89 Class<?> caller = Reflection.getCallerClass(); 90 if (!VM.isSystemDomainLoader(caller.getClassLoader())) 91 throw new SecurityException("Unsafe"); 92 return theUnsafe; 93 } 94 95 /// peek and poke operations 96 /// (compilers should optimize these to memory ops) 97 98 // These work on object fields in the Java heap. 99 // They will not work on elements of packed arrays. 100 101 /** 102 * Fetches a value from a given Java variable. 103 * More specifically, fetches a field or array element within the given 104 * object {@code o} at the given offset, or (if {@code o} is null) 105 * from the memory address whose numerical value is the given offset. 106 * <p> 107 * The results are undefined unless one of the following cases is true: 108 * <ul> 109 * <li>The offset was obtained from {@link #objectFieldOffset} on 110 * the {@link java.lang.reflect.Field} of some Java field and the object 111 * referred to by {@code o} is of a class compatible with that 112 * field's class. 113 * 114 * <li>The offset and object reference {@code o} (either null or 115 * non-null) were both obtained via {@link #staticFieldOffset} 116 * and {@link #staticFieldBase} (respectively) from the 117 * reflective {@link Field} representation of some Java field. 118 * 119 * <li>The object referred to by {@code o} is an array, and the offset 120 * is an integer of the form {@code B+N*S}, where {@code N} is 121 * a valid index into the array, and {@code B} and {@code S} are 122 * the values obtained by {@link #arrayBaseOffset} and {@link 123 * #arrayIndexScale} (respectively) from the array's class. The value 124 * referred to is the {@code N}<em>th</em> element of the array. 125 * 126 * </ul> 127 * <p> 128 * If one of the above cases is true, the call references a specific Java 129 * variable (field or array element). However, the results are undefined 130 * if that variable is not in fact of the type returned by this method. 131 * <p> 132 * This method refers to a variable by means of two parameters, and so 133 * it provides (in effect) a <em>double-register</em> addressing mode 134 * for Java variables. When the object reference is null, this method 135 * uses its offset as an absolute address. This is similar in operation 136 * to methods such as {@link #getInt(long)}, which provide (in effect) a 137 * <em>single-register</em> addressing mode for non-Java variables. 138 * However, because Java variables may have a different layout in memory 139 * from non-Java variables, programmers should not assume that these 140 * two addressing modes are ever equivalent. Also, programmers should 141 * remember that offsets from the double-register addressing mode cannot 142 * be portably confused with longs used in the single-register addressing 143 * mode. 144 * 145 * @param o Java heap object in which the variable resides, if any, else 146 * null 147 * @param offset indication of where the variable resides in a Java heap 148 * object, if any, else a memory address locating the variable 149 * statically 150 * @return the value fetched from the indicated Java variable 151 * @throws RuntimeException No defined exceptions are thrown, not even 152 * {@link NullPointerException} 153 */ 154 @HotSpotIntrinsicCandidate 155 public native int getInt(Object o, long offset); 156 157 /** 158 * Stores a value into a given Java variable. 159 * <p> 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 @HotSpotIntrinsicCandidate 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 @HotSpotIntrinsicCandidate 185 public native Object getObject(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 @HotSpotIntrinsicCandidate 198 public native void putObject(Object o, long offset, Object x); 199 200 /** @see #getInt(Object, long) */ 201 @HotSpotIntrinsicCandidate 202 public native boolean getBoolean(Object o, long offset); 203 /** @see #putInt(Object, long, int) */ 204 @HotSpotIntrinsicCandidate 205 public native void putBoolean(Object o, long offset, boolean x); 206 /** @see #getInt(Object, long) */ 207 @HotSpotIntrinsicCandidate 208 public native byte getByte(Object o, long offset); 209 /** @see #putInt(Object, long, int) */ 210 @HotSpotIntrinsicCandidate 211 public native void putByte(Object o, long offset, byte x); 212 /** @see #getInt(Object, long) */ 213 @HotSpotIntrinsicCandidate 214 public native short getShort(Object o, long offset); 215 /** @see #putInt(Object, long, int) */ 216 @HotSpotIntrinsicCandidate 217 public native void putShort(Object o, long offset, short x); 218 /** @see #getInt(Object, long) */ 219 @HotSpotIntrinsicCandidate 220 public native char getChar(Object o, long offset); 221 /** @see #putInt(Object, long, int) */ 222 @HotSpotIntrinsicCandidate 223 public native void putChar(Object o, long offset, char x); 224 /** @see #getInt(Object, long) */ 225 @HotSpotIntrinsicCandidate 226 public native long getLong(Object o, long offset); 227 /** @see #putInt(Object, long, int) */ 228 @HotSpotIntrinsicCandidate 229 public native void putLong(Object o, long offset, long x); 230 /** @see #getInt(Object, long) */ 231 @HotSpotIntrinsicCandidate 232 public native float getFloat(Object o, long offset); 233 /** @see #putInt(Object, long, int) */ 234 @HotSpotIntrinsicCandidate 235 public native void putFloat(Object o, long offset, float x); 236 /** @see #getInt(Object, long) */ 237 @HotSpotIntrinsicCandidate 238 public native double getDouble(Object o, long offset); 239 /** @see #putInt(Object, long, int) */ 240 @HotSpotIntrinsicCandidate 241 public native void putDouble(Object o, long offset, double x); 242 243 // These read VM internal data. 244 245 /** 246 * Fetches an uncompressed reference value from a given native variable 247 * ignoring the VM's compressed references mode. 248 * 249 * @param address a memory address locating the variable 250 * @return the value fetched from the indicated native variable 251 */ 252 public native Object getUncompressedObject(long address); 253 254 /** 255 * Fetches the {@link java.lang.Class} Java mirror for the given native 256 * metaspace {@code Klass} pointer. 257 * 258 * @param metaspaceKlass a native metaspace {@code Klass} pointer 259 * @return the {@link java.lang.Class} Java mirror 260 */ 261 public native Class<?> getJavaMirror(long metaspaceKlass); 262 263 /** 264 * Fetches a native metaspace {@code Klass} pointer for the given Java 265 * object. 266 * 267 * @param o Java heap object for which to fetch the class pointer 268 * @return a native metaspace {@code Klass} pointer 269 */ 270 public native long getKlassPointer(Object o); 271 272 // These work on values in the C heap. 273 274 /** 275 * Fetches a value from a given memory address. If the address is zero, or 276 * does not point into a block obtained from {@link #allocateMemory}, the 277 * results are undefined. 278 * 279 * @see #allocateMemory 280 */ 281 @HotSpotIntrinsicCandidate 282 public native byte getByte(long address); 283 284 /** 285 * Stores a value into a given memory address. If the address is zero, or 286 * does not point into a block obtained from {@link #allocateMemory}, the 287 * results are undefined. 288 * 289 * @see #getByte(long) 290 */ 291 @HotSpotIntrinsicCandidate 292 public native void putByte(long address, byte x); 293 294 /** @see #getByte(long) */ 295 @HotSpotIntrinsicCandidate 296 public native short getShort(long address); 297 /** @see #putByte(long, byte) */ 298 @HotSpotIntrinsicCandidate 299 public native void putShort(long address, short x); 300 /** @see #getByte(long) */ 301 @HotSpotIntrinsicCandidate 302 public native char getChar(long address); 303 /** @see #putByte(long, byte) */ 304 @HotSpotIntrinsicCandidate 305 public native void putChar(long address, char x); 306 /** @see #getByte(long) */ 307 @HotSpotIntrinsicCandidate 308 public native int getInt(long address); 309 /** @see #putByte(long, byte) */ 310 @HotSpotIntrinsicCandidate 311 public native void putInt(long address, int x); 312 /** @see #getByte(long) */ 313 @HotSpotIntrinsicCandidate 314 public native long getLong(long address); 315 /** @see #putByte(long, byte) */ 316 @HotSpotIntrinsicCandidate 317 public native void putLong(long address, long x); 318 /** @see #getByte(long) */ 319 @HotSpotIntrinsicCandidate 320 public native float getFloat(long address); 321 /** @see #putByte(long, byte) */ 322 @HotSpotIntrinsicCandidate 323 public native void putFloat(long address, float x); 324 /** @see #getByte(long) */ 325 @HotSpotIntrinsicCandidate 326 public native double getDouble(long address); 327 /** @see #putByte(long, byte) */ 328 @HotSpotIntrinsicCandidate 329 public native void putDouble(long address, double x); 330 331 /** 332 * Fetches a native pointer from a given memory address. If the address is 333 * zero, or does not point into a block obtained from {@link 334 * #allocateMemory}, the results are undefined. 335 * 336 * <p>If the native pointer is less than 64 bits wide, it is extended as 337 * an unsigned number to a Java long. The pointer may be indexed by any 338 * given byte offset, simply by adding that offset (as a simple integer) to 339 * the long representing the pointer. The number of bytes actually read 340 * from the target address may be determined by consulting {@link 341 * #addressSize}. 342 * 343 * @see #allocateMemory 344 */ 345 @HotSpotIntrinsicCandidate 346 public native long getAddress(long address); 347 348 /** 349 * Stores a native pointer into a given memory address. If the address is 350 * zero, or does not point into a block obtained from {@link 351 * #allocateMemory}, the results are undefined. 352 * 353 * <p>The number of bytes actually written at the target address may be 354 * determined by consulting {@link #addressSize}. 355 * 356 * @see #getAddress(long) 357 */ 358 @HotSpotIntrinsicCandidate 359 public native void putAddress(long address, long x); 360 361 /// wrappers for malloc, realloc, free: 362 363 /** 364 * Allocates a new block of native memory, of the given size in bytes. The 365 * contents of the memory are uninitialized; they will generally be 366 * garbage. The resulting native pointer will never be zero, and will be 367 * aligned for all value types. Dispose of this memory by calling {@link 368 * #freeMemory}, or resize it with {@link #reallocateMemory}. 369 * 370 * @throws IllegalArgumentException if the size is negative or too large 371 * for the native size_t type 372 * 373 * @throws OutOfMemoryError if the allocation is refused by the system 374 * 375 * @see #getByte(long) 376 * @see #putByte(long, byte) 377 */ 378 public native long allocateMemory(long bytes); 379 380 /** 381 * Resizes a new block of native memory, to the given size in bytes. The 382 * contents of the new block past the size of the old block are 383 * uninitialized; they will generally be garbage. The resulting native 384 * pointer will be zero if and only if the requested size is zero. The 385 * resulting native pointer will be aligned for all value types. Dispose 386 * of this memory by calling {@link #freeMemory}, or resize it with {@link 387 * #reallocateMemory}. The address passed to this method may be null, in 388 * which case an allocation will be performed. 389 * 390 * @throws IllegalArgumentException if the size is negative or too large 391 * for the native size_t type 392 * 393 * @throws OutOfMemoryError if the allocation is refused by the system 394 * 395 * @see #allocateMemory 396 */ 397 public native long reallocateMemory(long address, long bytes); 398 399 /** 400 * Sets all bytes in a given block of memory to a fixed value 401 * (usually zero). 402 * 403 * <p>This method determines a block's base address by means of two parameters, 404 * and so it provides (in effect) a <em>double-register</em> addressing mode, 405 * as discussed in {@link #getInt(Object,long)}. When the object reference is null, 406 * the offset supplies an absolute base address. 407 * 408 * <p>The stores are in coherent (atomic) units of a size determined 409 * by the address and length parameters. If the effective address and 410 * length are all even modulo 8, the stores take place in 'long' units. 411 * If the effective address and length are (resp.) even modulo 4 or 2, 412 * the stores take place in units of 'int' or 'short'. 413 * 414 * @since 1.7 415 */ 416 public native void setMemory(Object o, long offset, long bytes, byte value); 417 418 /** 419 * Sets all bytes in a given block of memory to a fixed value 420 * (usually zero). This provides a <em>single-register</em> addressing mode, 421 * as discussed in {@link #getInt(Object,long)}. 422 * 423 * <p>Equivalent to {@code setMemory(null, address, bytes, value)}. 424 */ 425 public void setMemory(long address, long bytes, byte value) { 426 setMemory(null, address, bytes, value); 427 } 428 429 /** 430 * Sets all bytes in a given block of memory to a copy of another 431 * block. 432 * 433 * <p>This method determines each block's base address by means of two parameters, 434 * and so it provides (in effect) a <em>double-register</em> addressing mode, 435 * as discussed in {@link #getInt(Object,long)}. When the object reference is null, 436 * the offset supplies an absolute base address. 437 * 438 * <p>The transfers are in coherent (atomic) units of a size determined 439 * by the address and length parameters. If the effective addresses and 440 * length are all even modulo 8, the transfer takes place in 'long' units. 441 * If the effective addresses and length are (resp.) even modulo 4 or 2, 442 * the transfer takes place in units of 'int' or 'short'. 443 * 444 * @since 1.7 445 */ 446 @HotSpotIntrinsicCandidate 447 public native void copyMemory(Object srcBase, long srcOffset, 448 Object destBase, long destOffset, 449 long bytes); 450 /** 451 * Sets all bytes in a given block of memory to a copy of another 452 * block. This provides a <em>single-register</em> addressing mode, 453 * as discussed in {@link #getInt(Object,long)}. 454 * 455 * Equivalent to {@code copyMemory(null, srcAddress, null, destAddress, bytes)}. 456 */ 457 public void copyMemory(long srcAddress, long destAddress, long bytes) { 458 copyMemory(null, srcAddress, null, destAddress, bytes); 459 } 460 461 private boolean isPrimitiveArray(Class<?> c) { 462 Class<?> componentType = c.getComponentType(); 463 return componentType != null && componentType.isPrimitive(); 464 } 465 466 private native void copySwapMemory0(Object srcBase, long srcOffset, 467 Object destBase, long destOffset, 468 long bytes, long elemSize); 469 470 /** 471 * Copies all elements from one block of memory to another block, 472 * *unconditionally* byte swapping the elements on the fly. 473 * 474 * <p>This method determines each block's base address by means of two parameters, 475 * and so it provides (in effect) a <em>double-register</em> addressing mode, 476 * as discussed in {@link #getInt(Object,long)}. When the object reference is null, 477 * the offset supplies an absolute base address. 478 * 479 * @since 9 480 */ 481 public void copySwapMemory(Object srcBase, long srcOffset, 482 Object destBase, long destOffset, 483 long bytes, long elemSize) { 484 if (bytes < 0) { 485 throw new IllegalArgumentException(); 486 } 487 if (elemSize != 2 && elemSize != 4 && elemSize != 8) { 488 throw new IllegalArgumentException(); 489 } 490 if (bytes % elemSize != 0) { 491 throw new IllegalArgumentException(); 492 } 493 if ((srcBase == null && srcOffset == 0) || 494 (destBase == null && destOffset == 0)) { 495 throw new NullPointerException(); 496 } 497 498 // Must be off-heap, or primitive heap arrays 499 if (srcBase != null && (srcOffset < 0 || !isPrimitiveArray(srcBase.getClass()))) { 500 throw new IllegalArgumentException(); 501 } 502 if (destBase != null && (destOffset < 0 || !isPrimitiveArray(destBase.getClass()))) { 503 throw new IllegalArgumentException(); 504 } 505 506 // Sanity check size and offsets on 32-bit platforms. Most 507 // significant 32 bits must be zero. 508 if (ADDRESS_SIZE == 4 && 509 (bytes >>> 32 != 0 || srcOffset >>> 32 != 0 || destOffset >>> 32 != 0)) { 510 throw new IllegalArgumentException(); 511 } 512 513 if (bytes == 0) { 514 return; 515 } 516 517 copySwapMemory0(srcBase, srcOffset, destBase, destOffset, bytes, elemSize); 518 } 519 520 /** 521 * Copies all elements from one block of memory to another block, byte swapping the 522 * elements on the fly. 523 * 524 * This provides a <em>single-register</em> addressing mode, as 525 * discussed in {@link #getInt(Object,long)}. 526 * 527 * Equivalent to {@code copySwapMemory(null, srcAddress, null, destAddress, bytes, elemSize)}. 528 */ 529 public void copySwapMemory(long srcAddress, long destAddress, long bytes, long elemSize) { 530 copySwapMemory(null, srcAddress, null, destAddress, bytes, elemSize); 531 } 532 533 /** 534 * Disposes of a block of native memory, as obtained from {@link 535 * #allocateMemory} or {@link #reallocateMemory}. The address passed to 536 * this method may be null, in which case no action is taken. 537 * 538 * @see #allocateMemory 539 */ 540 public native void freeMemory(long address); 541 542 /// random queries 543 544 /** 545 * This constant differs from all results that will ever be returned from 546 * {@link #staticFieldOffset}, {@link #objectFieldOffset}, 547 * or {@link #arrayBaseOffset}. 548 */ 549 public static final int INVALID_FIELD_OFFSET = -1; 550 551 /** 552 * Reports the location of a given field in the storage allocation of its 553 * class. Do not expect to perform any sort of arithmetic on this offset; 554 * it is just a cookie which is passed to the unsafe heap memory accessors. 555 * 556 * <p>Any given field will always have the same offset and base, and no 557 * two distinct fields of the same class will ever have the same offset 558 * and base. 559 * 560 * <p>As of 1.4.1, offsets for fields are represented as long values, 561 * although the Sun JVM does not use the most significant 32 bits. 562 * However, JVM implementations which store static fields at absolute 563 * addresses can use long offsets and null base pointers to express 564 * the field locations in a form usable by {@link #getInt(Object,long)}. 565 * Therefore, code which will be ported to such JVMs on 64-bit platforms 566 * must preserve all bits of static field offsets. 567 * @see #getInt(Object, long) 568 */ 569 public native long objectFieldOffset(Field f); 570 571 /** 572 * Reports the location of a given static field, in conjunction with {@link 573 * #staticFieldBase}. 574 * <p>Do not expect to perform any sort of arithmetic on this offset; 575 * it is just a cookie which is passed to the unsafe heap memory accessors. 576 * 577 * <p>Any given field will always have the same offset, and no two distinct 578 * fields of the same class will ever have the same offset. 579 * 580 * <p>As of 1.4.1, offsets for fields are represented as long values, 581 * although the Sun JVM does not use the most significant 32 bits. 582 * It is hard to imagine a JVM technology which needs more than 583 * a few bits to encode an offset within a non-array object, 584 * However, for consistency with other methods in this class, 585 * this method reports its result as a long value. 586 * @see #getInt(Object, long) 587 */ 588 public native long staticFieldOffset(Field f); 589 590 /** 591 * Reports the location of a given static field, in conjunction with {@link 592 * #staticFieldOffset}. 593 * <p>Fetch the base "Object", if any, with which static fields of the 594 * given class can be accessed via methods like {@link #getInt(Object, 595 * long)}. This value may be null. This value may refer to an object 596 * which is a "cookie", not guaranteed to be a real Object, and it should 597 * not be used in any way except as argument to the get and put routines in 598 * this class. 599 */ 600 public native Object staticFieldBase(Field f); 601 602 /** 603 * Detects if the given class may need to be initialized. This is often 604 * needed in conjunction with obtaining the static field base of a 605 * class. 606 * @return false only if a call to {@code ensureClassInitialized} would have no effect 607 */ 608 public native boolean shouldBeInitialized(Class<?> c); 609 610 /** 611 * Ensures the given class has been initialized. This is often 612 * needed in conjunction with obtaining the static field base of a 613 * class. 614 */ 615 public native void ensureClassInitialized(Class<?> c); 616 617 /** 618 * Reports the offset of the first element in the storage allocation of a 619 * given array class. If {@link #arrayIndexScale} returns a non-zero value 620 * for the same class, you may use that scale factor, together with this 621 * base offset, to form new offsets to access elements of arrays of the 622 * given class. 623 * 624 * @see #getInt(Object, long) 625 * @see #putInt(Object, long, int) 626 */ 627 public native int arrayBaseOffset(Class<?> arrayClass); 628 629 /** The value of {@code arrayBaseOffset(boolean[].class)} */ 630 public static final int ARRAY_BOOLEAN_BASE_OFFSET 631 = theUnsafe.arrayBaseOffset(boolean[].class); 632 633 /** The value of {@code arrayBaseOffset(byte[].class)} */ 634 public static final int ARRAY_BYTE_BASE_OFFSET 635 = theUnsafe.arrayBaseOffset(byte[].class); 636 637 /** The value of {@code arrayBaseOffset(short[].class)} */ 638 public static final int ARRAY_SHORT_BASE_OFFSET 639 = theUnsafe.arrayBaseOffset(short[].class); 640 641 /** The value of {@code arrayBaseOffset(char[].class)} */ 642 public static final int ARRAY_CHAR_BASE_OFFSET 643 = theUnsafe.arrayBaseOffset(char[].class); 644 645 /** The value of {@code arrayBaseOffset(int[].class)} */ 646 public static final int ARRAY_INT_BASE_OFFSET 647 = theUnsafe.arrayBaseOffset(int[].class); 648 649 /** The value of {@code arrayBaseOffset(long[].class)} */ 650 public static final int ARRAY_LONG_BASE_OFFSET 651 = theUnsafe.arrayBaseOffset(long[].class); 652 653 /** The value of {@code arrayBaseOffset(float[].class)} */ 654 public static final int ARRAY_FLOAT_BASE_OFFSET 655 = theUnsafe.arrayBaseOffset(float[].class); 656 657 /** The value of {@code arrayBaseOffset(double[].class)} */ 658 public static final int ARRAY_DOUBLE_BASE_OFFSET 659 = theUnsafe.arrayBaseOffset(double[].class); 660 661 /** The value of {@code arrayBaseOffset(Object[].class)} */ 662 public static final int ARRAY_OBJECT_BASE_OFFSET 663 = theUnsafe.arrayBaseOffset(Object[].class); 664 665 /** 666 * Reports the scale factor for addressing elements in the storage 667 * allocation of a given array class. However, arrays of "narrow" types 668 * will generally not work properly with accessors like {@link 669 * #getByte(Object, long)}, so the scale factor for such classes is reported 670 * as zero. 671 * 672 * @see #arrayBaseOffset 673 * @see #getInt(Object, long) 674 * @see #putInt(Object, long, int) 675 */ 676 public native int arrayIndexScale(Class<?> arrayClass); 677 678 /** The value of {@code arrayIndexScale(boolean[].class)} */ 679 public static final int ARRAY_BOOLEAN_INDEX_SCALE 680 = theUnsafe.arrayIndexScale(boolean[].class); 681 682 /** The value of {@code arrayIndexScale(byte[].class)} */ 683 public static final int ARRAY_BYTE_INDEX_SCALE 684 = theUnsafe.arrayIndexScale(byte[].class); 685 686 /** The value of {@code arrayIndexScale(short[].class)} */ 687 public static final int ARRAY_SHORT_INDEX_SCALE 688 = theUnsafe.arrayIndexScale(short[].class); 689 690 /** The value of {@code arrayIndexScale(char[].class)} */ 691 public static final int ARRAY_CHAR_INDEX_SCALE 692 = theUnsafe.arrayIndexScale(char[].class); 693 694 /** The value of {@code arrayIndexScale(int[].class)} */ 695 public static final int ARRAY_INT_INDEX_SCALE 696 = theUnsafe.arrayIndexScale(int[].class); 697 698 /** The value of {@code arrayIndexScale(long[].class)} */ 699 public static final int ARRAY_LONG_INDEX_SCALE 700 = theUnsafe.arrayIndexScale(long[].class); 701 702 /** The value of {@code arrayIndexScale(float[].class)} */ 703 public static final int ARRAY_FLOAT_INDEX_SCALE 704 = theUnsafe.arrayIndexScale(float[].class); 705 706 /** The value of {@code arrayIndexScale(double[].class)} */ 707 public static final int ARRAY_DOUBLE_INDEX_SCALE 708 = theUnsafe.arrayIndexScale(double[].class); 709 710 /** The value of {@code arrayIndexScale(Object[].class)} */ 711 public static final int ARRAY_OBJECT_INDEX_SCALE 712 = theUnsafe.arrayIndexScale(Object[].class); 713 714 /** 715 * Reports the size in bytes of a native pointer, as stored via {@link 716 * #putAddress}. This value will be either 4 or 8. Note that the sizes of 717 * other primitive types (as stored in native memory blocks) is determined 718 * fully by their information content. 719 */ 720 public native int addressSize(); 721 722 /** The value of {@code addressSize()} */ 723 public static final int ADDRESS_SIZE = theUnsafe.addressSize(); 724 725 /** 726 * Reports the size in bytes of a native memory page (whatever that is). 727 * This value will always be a power of two. 728 */ 729 public native int pageSize(); 730 731 732 /// random trusted operations from JNI: 733 734 /** 735 * Tells the VM to define a class, without security checks. By default, the 736 * class loader and protection domain come from the caller's class. 737 */ 738 public native Class<?> defineClass(String name, byte[] b, int off, int len, 739 ClassLoader loader, 740 ProtectionDomain protectionDomain); 741 742 /** 743 * Defines a class but does not make it known to the class loader or system dictionary. 744 * <p> 745 * For each CP entry, the corresponding CP patch must either be null or have 746 * the a format that matches its tag: 747 * <ul> 748 * <li>Integer, Long, Float, Double: the corresponding wrapper object type from java.lang 749 * <li>Utf8: a string (must have suitable syntax if used as signature or name) 750 * <li>Class: any java.lang.Class object 751 * <li>String: any object (not just a java.lang.String) 752 * <li>InterfaceMethodRef: (NYI) a method handle to invoke on that call site's arguments 753 * </ul> 754 * @param hostClass context for linkage, access control, protection domain, and class loader 755 * @param data bytes of a class file 756 * @param cpPatches where non-null entries exist, they replace corresponding CP entries in data 757 */ 758 public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches); 759 760 /** 761 * Allocates an instance but does not run any constructor. 762 * Initializes the class if it has not yet been. 763 */ 764 @HotSpotIntrinsicCandidate 765 public native Object allocateInstance(Class<?> cls) 766 throws InstantiationException; 767 768 /** Throws the exception without telling the verifier. */ 769 public native void throwException(Throwable ee); 770 771 /** 772 * Atomically updates Java variable to {@code x} if it is currently 773 * holding {@code expected}. 774 * 775 * <p>This operation has memory semantics of a {@code volatile} read 776 * and write. Corresponds to C11 atomic_compare_exchange_strong. 777 * 778 * @return {@code true} if successful 779 */ 780 @HotSpotIntrinsicCandidate 781 public final native boolean compareAndSwapObject(Object o, long offset, 782 Object expected, 783 Object x); 784 785 @HotSpotIntrinsicCandidate 786 public final native Object compareAndExchangeObjectVolatile(Object o, long offset, 787 Object expected, 788 Object x); 789 790 @HotSpotIntrinsicCandidate 791 public final Object compareAndExchangeObjectAcquire(Object o, long offset, 792 Object expected, 793 Object x) { 794 return compareAndExchangeObjectVolatile(o, offset, expected, x); 795 } 796 797 @HotSpotIntrinsicCandidate 798 public final Object compareAndExchangeObjectRelease(Object o, long offset, 799 Object expected, 800 Object x) { 801 return compareAndExchangeObjectVolatile(o, offset, expected, x); 802 } 803 804 @HotSpotIntrinsicCandidate 805 public final boolean weakCompareAndSwapObject(Object o, long offset, 806 Object expected, 807 Object x) { 808 return compareAndSwapObject(o, offset, expected, x); 809 } 810 811 @HotSpotIntrinsicCandidate 812 public final boolean weakCompareAndSwapObjectAcquire(Object o, long offset, 813 Object expected, 814 Object x) { 815 return compareAndSwapObject(o, offset, expected, x); 816 } 817 818 @HotSpotIntrinsicCandidate 819 public final boolean weakCompareAndSwapObjectRelease(Object o, long offset, 820 Object expected, 821 Object x) { 822 return compareAndSwapObject(o, offset, expected, x); 823 } 824 825 /** 826 * Atomically updates Java variable to {@code x} if it is currently 827 * holding {@code expected}. 828 * 829 * <p>This operation has memory semantics of a {@code volatile} read 830 * and write. Corresponds to C11 atomic_compare_exchange_strong. 831 * 832 * @return {@code true} if successful 833 */ 834 @HotSpotIntrinsicCandidate 835 public final native boolean compareAndSwapInt(Object o, long offset, 836 int expected, 837 int x); 838 839 @HotSpotIntrinsicCandidate 840 public final native int compareAndExchangeIntVolatile(Object o, long offset, 841 int expected, 842 int x); 843 844 @HotSpotIntrinsicCandidate 845 public final int compareAndExchangeIntAcquire(Object o, long offset, 846 int expected, 847 int x) { 848 return compareAndExchangeIntVolatile(o, offset, expected, x); 849 } 850 851 @HotSpotIntrinsicCandidate 852 public final int compareAndExchangeIntRelease(Object o, long offset, 853 int expected, 854 int x) { 855 return compareAndExchangeIntVolatile(o, offset, expected, x); 856 } 857 858 @HotSpotIntrinsicCandidate 859 public final boolean weakCompareAndSwapInt(Object o, long offset, 860 int expected, 861 int x) { 862 return compareAndSwapInt(o, offset, expected, x); 863 } 864 865 @HotSpotIntrinsicCandidate 866 public final boolean weakCompareAndSwapIntAcquire(Object o, long offset, 867 int expected, 868 int x) { 869 return compareAndSwapInt(o, offset, expected, x); 870 } 871 872 @HotSpotIntrinsicCandidate 873 public final boolean weakCompareAndSwapIntRelease(Object o, long offset, 874 int expected, 875 int x) { 876 return compareAndSwapInt(o, offset, expected, x); 877 } 878 879 /** 880 * Atomically updates Java variable to {@code x} if it is currently 881 * holding {@code expected}. 882 * 883 * <p>This operation has memory semantics of a {@code volatile} read 884 * and write. Corresponds to C11 atomic_compare_exchange_strong. 885 * 886 * @return {@code true} if successful 887 */ 888 @HotSpotIntrinsicCandidate 889 public final native boolean compareAndSwapLong(Object o, long offset, 890 long expected, 891 long x); 892 893 @HotSpotIntrinsicCandidate 894 public final native long compareAndExchangeLongVolatile(Object o, long offset, 895 long expected, 896 long x); 897 898 @HotSpotIntrinsicCandidate 899 public final long compareAndExchangeLongAcquire(Object o, long offset, 900 long expected, 901 long x) { 902 return compareAndExchangeLongVolatile(o, offset, expected, x); 903 } 904 905 @HotSpotIntrinsicCandidate 906 public final long compareAndExchangeLongRelease(Object o, long offset, 907 long expected, 908 long x) { 909 return compareAndExchangeLongVolatile(o, offset, expected, x); 910 } 911 912 @HotSpotIntrinsicCandidate 913 public final boolean weakCompareAndSwapLong(Object o, long offset, 914 long expected, 915 long x) { 916 return compareAndSwapLong(o, offset, expected, x); 917 } 918 919 @HotSpotIntrinsicCandidate 920 public final boolean weakCompareAndSwapLongAcquire(Object o, long offset, 921 long expected, 922 long x) { 923 return compareAndSwapLong(o, offset, expected, x); 924 } 925 926 @HotSpotIntrinsicCandidate 927 public final boolean weakCompareAndSwapLongRelease(Object o, long offset, 928 long expected, 929 long x) { 930 return compareAndSwapLong(o, offset, expected, x); 931 } 932 933 /** 934 * Fetches a reference value from a given Java variable, with volatile 935 * load semantics. Otherwise identical to {@link #getObject(Object, long)} 936 */ 937 @HotSpotIntrinsicCandidate 938 public native Object getObjectVolatile(Object o, long offset); 939 940 /** 941 * Stores a reference value into a given Java variable, with 942 * volatile store semantics. Otherwise identical to {@link #putObject(Object, long, Object)} 943 */ 944 @HotSpotIntrinsicCandidate 945 public native void putObjectVolatile(Object o, long offset, Object x); 946 947 /** Volatile version of {@link #getInt(Object, long)} */ 948 @HotSpotIntrinsicCandidate 949 public native int getIntVolatile(Object o, long offset); 950 951 /** Volatile version of {@link #putInt(Object, long, int)} */ 952 @HotSpotIntrinsicCandidate 953 public native void putIntVolatile(Object o, long offset, int x); 954 955 /** Volatile version of {@link #getBoolean(Object, long)} */ 956 @HotSpotIntrinsicCandidate 957 public native boolean getBooleanVolatile(Object o, long offset); 958 959 /** Volatile version of {@link #putBoolean(Object, long, boolean)} */ 960 @HotSpotIntrinsicCandidate 961 public native void putBooleanVolatile(Object o, long offset, boolean x); 962 963 /** Volatile version of {@link #getByte(Object, long)} */ 964 @HotSpotIntrinsicCandidate 965 public native byte getByteVolatile(Object o, long offset); 966 967 /** Volatile version of {@link #putByte(Object, long, byte)} */ 968 @HotSpotIntrinsicCandidate 969 public native void putByteVolatile(Object o, long offset, byte x); 970 971 /** Volatile version of {@link #getShort(Object, long)} */ 972 @HotSpotIntrinsicCandidate 973 public native short getShortVolatile(Object o, long offset); 974 975 /** Volatile version of {@link #putShort(Object, long, short)} */ 976 @HotSpotIntrinsicCandidate 977 public native void putShortVolatile(Object o, long offset, short x); 978 979 /** Volatile version of {@link #getChar(Object, long)} */ 980 @HotSpotIntrinsicCandidate 981 public native char getCharVolatile(Object o, long offset); 982 983 /** Volatile version of {@link #putChar(Object, long, char)} */ 984 @HotSpotIntrinsicCandidate 985 public native void putCharVolatile(Object o, long offset, char x); 986 987 /** Volatile version of {@link #getLong(Object, long)} */ 988 @HotSpotIntrinsicCandidate 989 public native long getLongVolatile(Object o, long offset); 990 991 /** Volatile version of {@link #putLong(Object, long, long)} */ 992 @HotSpotIntrinsicCandidate 993 public native void putLongVolatile(Object o, long offset, long x); 994 995 /** Volatile version of {@link #getFloat(Object, long)} */ 996 @HotSpotIntrinsicCandidate 997 public native float getFloatVolatile(Object o, long offset); 998 999 /** Volatile version of {@link #putFloat(Object, long, float)} */ 1000 @HotSpotIntrinsicCandidate 1001 public native void putFloatVolatile(Object o, long offset, float x); 1002 1003 /** Volatile version of {@link #getDouble(Object, long)} */ 1004 @HotSpotIntrinsicCandidate 1005 public native double getDoubleVolatile(Object o, long offset); 1006 1007 /** Volatile version of {@link #putDouble(Object, long, double)} */ 1008 @HotSpotIntrinsicCandidate 1009 public native void putDoubleVolatile(Object o, long offset, double x); 1010 1011 /** 1012 * Version of {@link #putObjectVolatile(Object, long, Object)} 1013 * that does not guarantee immediate visibility of the store to 1014 * other threads. This method is generally only useful if the 1015 * underlying field is a Java volatile (or if an array cell, one 1016 * that is otherwise only accessed using volatile accesses). 1017 * 1018 * Corresponds to C11 atomic_store_explicit(..., memory_order_release). 1019 */ 1020 @HotSpotIntrinsicCandidate 1021 public native void putOrderedObject(Object o, long offset, Object x); 1022 1023 /** Ordered/Lazy version of {@link #putIntVolatile(Object, long, int)} */ 1024 @HotSpotIntrinsicCandidate 1025 public native void putOrderedInt(Object o, long offset, int x); 1026 1027 /** Ordered/Lazy version of {@link #putLongVolatile(Object, long, long)} */ 1028 @HotSpotIntrinsicCandidate 1029 public native void putOrderedLong(Object o, long offset, long x); 1030 1031 /** Acquire version of {@link #getObjectVolatile(Object, long)} */ 1032 @HotSpotIntrinsicCandidate 1033 public final Object getObjectAcquire(Object o, long offset) { 1034 return getObjectVolatile(o, offset); 1035 } 1036 1037 /** Acquire version of {@link #getBooleanVolatile(Object, long)} */ 1038 @HotSpotIntrinsicCandidate 1039 public final boolean getBooleanAcquire(Object o, long offset) { 1040 return getBooleanVolatile(o, offset); 1041 } 1042 1043 /** Acquire version of {@link #getByteVolatile(Object, long)} */ 1044 @HotSpotIntrinsicCandidate 1045 public final byte getByteAcquire(Object o, long offset) { 1046 return getByteVolatile(o, offset); 1047 } 1048 1049 /** Acquire version of {@link #getShortVolatile(Object, long)} */ 1050 @HotSpotIntrinsicCandidate 1051 public final short getShortAcquire(Object o, long offset) { 1052 return getShortVolatile(o, offset); 1053 } 1054 1055 /** Acquire version of {@link #getCharVolatile(Object, long)} */ 1056 @HotSpotIntrinsicCandidate 1057 public final char getCharAcquire(Object o, long offset) { 1058 return getCharVolatile(o, offset); 1059 } 1060 1061 /** Acquire version of {@link #getIntVolatile(Object, long)} */ 1062 @HotSpotIntrinsicCandidate 1063 public final int getIntAcquire(Object o, long offset) { 1064 return getIntVolatile(o, offset); 1065 } 1066 1067 /** Acquire version of {@link #getFloatVolatile(Object, long)} */ 1068 @HotSpotIntrinsicCandidate 1069 public final float getFloatAcquire(Object o, long offset) { 1070 return getFloatVolatile(o, offset); 1071 } 1072 1073 /** Acquire version of {@link #getLongVolatile(Object, long)} */ 1074 @HotSpotIntrinsicCandidate 1075 public final long getLongAcquire(Object o, long offset) { 1076 return getLongVolatile(o, offset); 1077 } 1078 1079 /** Acquire version of {@link #getDoubleVolatile(Object, long)} */ 1080 @HotSpotIntrinsicCandidate 1081 public final double getDoubleAcquire(Object o, long offset) { 1082 return getDoubleVolatile(o, offset); 1083 } 1084 1085 /** Release version of {@link #putObjectVolatile(Object, long, Object)} */ 1086 @HotSpotIntrinsicCandidate 1087 public final void putObjectRelease(Object o, long offset, Object x) { 1088 putObjectVolatile(o, offset, x); 1089 } 1090 1091 /** Release version of {@link #putBooleanVolatile(Object, long, boolean)} */ 1092 @HotSpotIntrinsicCandidate 1093 public final void putBooleanRelease(Object o, long offset, boolean x) { 1094 putBooleanVolatile(o, offset, x); 1095 } 1096 1097 /** Release version of {@link #putByteVolatile(Object, long, byte)} */ 1098 @HotSpotIntrinsicCandidate 1099 public final void putByteRelease(Object o, long offset, byte x) { 1100 putByteVolatile(o, offset, x); 1101 } 1102 1103 /** Release version of {@link #putShortVolatile(Object, long, short)} */ 1104 @HotSpotIntrinsicCandidate 1105 public final void putShortRelease(Object o, long offset, short x) { 1106 putShortVolatile(o, offset, x); 1107 } 1108 1109 /** Release version of {@link #putCharVolatile(Object, long, char)} */ 1110 @HotSpotIntrinsicCandidate 1111 public final void putCharRelease(Object o, long offset, char x) { 1112 putCharVolatile(o, offset, x); 1113 } 1114 1115 /** Release version of {@link #putIntVolatile(Object, long, int)} */ 1116 @HotSpotIntrinsicCandidate 1117 public final void putIntRelease(Object o, long offset, int x) { 1118 putIntVolatile(o, offset, x); 1119 } 1120 1121 /** Release version of {@link #putFloatVolatile(Object, long, float)} */ 1122 @HotSpotIntrinsicCandidate 1123 public final void putFloatRelease(Object o, long offset, float x) { 1124 putFloatVolatile(o, offset, x); 1125 } 1126 1127 /** Release version of {@link #putLongVolatile(Object, long, long)} */ 1128 @HotSpotIntrinsicCandidate 1129 public final void putLongRelease(Object o, long offset, long x) { 1130 putLongVolatile(o, offset, x); 1131 } 1132 1133 /** Release version of {@link #putDoubleVolatile(Object, long, double)} */ 1134 @HotSpotIntrinsicCandidate 1135 public final void putDoubleRelease(Object o, long offset, double x) { 1136 putDoubleVolatile(o, offset, x); 1137 } 1138 1139 // ------------------------------ Opaque -------------------------------------- 1140 1141 /** Opaque version of {@link #getObjectVolatile(Object, long)} */ 1142 @HotSpotIntrinsicCandidate 1143 public final Object getObjectOpaque(Object o, long offset) { 1144 return getObjectVolatile(o, offset); 1145 } 1146 1147 /** Opaque version of {@link #getBooleanVolatile(Object, long)} */ 1148 @HotSpotIntrinsicCandidate 1149 public final boolean getBooleanOpaque(Object o, long offset) { 1150 return getBooleanVolatile(o, offset); 1151 } 1152 1153 /** Opaque version of {@link #getByteVolatile(Object, long)} */ 1154 @HotSpotIntrinsicCandidate 1155 public final byte getByteOpaque(Object o, long offset) { 1156 return getByteVolatile(o, offset); 1157 } 1158 1159 /** Opaque version of {@link #getShortVolatile(Object, long)} */ 1160 @HotSpotIntrinsicCandidate 1161 public final short getShortOpaque(Object o, long offset) { 1162 return getShortVolatile(o, offset); 1163 } 1164 1165 /** Opaque version of {@link #getCharVolatile(Object, long)} */ 1166 @HotSpotIntrinsicCandidate 1167 public final char getCharOpaque(Object o, long offset) { 1168 return getCharVolatile(o, offset); 1169 } 1170 1171 /** Opaque version of {@link #getIntVolatile(Object, long)} */ 1172 @HotSpotIntrinsicCandidate 1173 public final int getIntOpaque(Object o, long offset) { 1174 return getIntVolatile(o, offset); 1175 } 1176 1177 /** Opaque version of {@link #getFloatVolatile(Object, long)} */ 1178 @HotSpotIntrinsicCandidate 1179 public final float getFloatOpaque(Object o, long offset) { 1180 return getFloatVolatile(o, offset); 1181 } 1182 1183 /** Opaque version of {@link #getLongVolatile(Object, long)} */ 1184 @HotSpotIntrinsicCandidate 1185 public final long getLongOpaque(Object o, long offset) { 1186 return getLongVolatile(o, offset); 1187 } 1188 1189 /** Opaque version of {@link #getDoubleVolatile(Object, long)} */ 1190 @HotSpotIntrinsicCandidate 1191 public final double getDoubleOpaque(Object o, long offset) { 1192 return getDoubleVolatile(o, offset); 1193 } 1194 1195 /** Opaque version of {@link #putObjectVolatile(Object, long, Object)} */ 1196 @HotSpotIntrinsicCandidate 1197 public final void putObjectOpaque(Object o, long offset, Object x) { 1198 putObjectVolatile(o, offset, x); 1199 } 1200 1201 /** Opaque version of {@link #putBooleanVolatile(Object, long, boolean)} */ 1202 @HotSpotIntrinsicCandidate 1203 public final void putBooleanOpaque(Object o, long offset, boolean x) { 1204 putBooleanVolatile(o, offset, x); 1205 } 1206 1207 /** Opaque version of {@link #putByteVolatile(Object, long, byte)} */ 1208 @HotSpotIntrinsicCandidate 1209 public final void putByteOpaque(Object o, long offset, byte x) { 1210 putByteVolatile(o, offset, x); 1211 } 1212 1213 /** Opaque version of {@link #putShortVolatile(Object, long, short)} */ 1214 @HotSpotIntrinsicCandidate 1215 public final void putShortOpaque(Object o, long offset, short x) { 1216 putShortVolatile(o, offset, x); 1217 } 1218 1219 /** Opaque version of {@link #putCharVolatile(Object, long, char)} */ 1220 @HotSpotIntrinsicCandidate 1221 public final void putCharOpaque(Object o, long offset, char x) { 1222 putCharVolatile(o, offset, x); 1223 } 1224 1225 /** Opaque version of {@link #putIntVolatile(Object, long, int)} */ 1226 @HotSpotIntrinsicCandidate 1227 public final void putIntOpaque(Object o, long offset, int x) { 1228 putIntVolatile(o, offset, x); 1229 } 1230 1231 /** Opaque version of {@link #putFloatVolatile(Object, long, float)} */ 1232 @HotSpotIntrinsicCandidate 1233 public final void putFloatOpaque(Object o, long offset, float x) { 1234 putFloatVolatile(o, offset, x); 1235 } 1236 1237 /** Opaque version of {@link #putLongVolatile(Object, long, long)} */ 1238 @HotSpotIntrinsicCandidate 1239 public final void putLongOpaque(Object o, long offset, long x) { 1240 putLongVolatile(o, offset, x); 1241 } 1242 1243 /** Opaque version of {@link #putDoubleVolatile(Object, long, double)} */ 1244 @HotSpotIntrinsicCandidate 1245 public final void putDoubleOpaque(Object o, long offset, double x) { 1246 putDoubleVolatile(o, offset, x); 1247 } 1248 1249 /** 1250 * Unblocks the given thread blocked on {@code park}, or, if it is 1251 * not blocked, causes the subsequent call to {@code park} not to 1252 * block. Note: this operation is "unsafe" solely because the 1253 * caller must somehow ensure that the thread has not been 1254 * destroyed. Nothing special is usually required to ensure this 1255 * when called from Java (in which there will ordinarily be a live 1256 * reference to the thread) but this is not nearly-automatically 1257 * so when calling from native code. 1258 * 1259 * @param thread the thread to unpark. 1260 */ 1261 @HotSpotIntrinsicCandidate 1262 public native void unpark(Object thread); 1263 1264 /** 1265 * Blocks current thread, returning when a balancing 1266 * {@code unpark} occurs, or a balancing {@code unpark} has 1267 * already occurred, or the thread is interrupted, or, if not 1268 * absolute and time is not zero, the given time nanoseconds have 1269 * elapsed, or if absolute, the given deadline in milliseconds 1270 * since Epoch has passed, or spuriously (i.e., returning for no 1271 * "reason"). Note: This operation is in the Unsafe class only 1272 * because {@code unpark} is, so it would be strange to place it 1273 * elsewhere. 1274 */ 1275 @HotSpotIntrinsicCandidate 1276 public native void park(boolean isAbsolute, long time); 1277 1278 /** 1279 * Gets the load average in the system run queue assigned 1280 * to the available processors averaged over various periods of time. 1281 * This method retrieves the given {@code nelem} samples and 1282 * assigns to the elements of the given {@code loadavg} array. 1283 * The system imposes a maximum of 3 samples, representing 1284 * averages over the last 1, 5, and 15 minutes, respectively. 1285 * 1286 * @param loadavg an array of double of size nelems 1287 * @param nelems the number of samples to be retrieved and 1288 * must be 1 to 3. 1289 * 1290 * @return the number of samples actually retrieved; or -1 1291 * if the load average is unobtainable. 1292 */ 1293 public native int getLoadAverage(double[] loadavg, int nelems); 1294 1295 // The following contain CAS-based Java implementations used on 1296 // platforms not supporting native instructions 1297 1298 /** 1299 * Atomically adds the given value to the current value of a field 1300 * or array element within the given object {@code o} 1301 * at the given {@code offset}. 1302 * 1303 * @param o object/array to update the field/element in 1304 * @param offset field/element offset 1305 * @param delta the value to add 1306 * @return the previous value 1307 * @since 1.8 1308 */ 1309 @HotSpotIntrinsicCandidate 1310 public final int getAndAddInt(Object o, long offset, int delta) { 1311 int v; 1312 do { 1313 v = getIntVolatile(o, offset); 1314 } while (!compareAndSwapInt(o, offset, v, v + delta)); 1315 return v; 1316 } 1317 1318 /** 1319 * Atomically adds the given value to the current value of a field 1320 * or array element within the given object {@code o} 1321 * at the given {@code offset}. 1322 * 1323 * @param o object/array to update the field/element in 1324 * @param offset field/element offset 1325 * @param delta the value to add 1326 * @return the previous value 1327 * @since 1.8 1328 */ 1329 @HotSpotIntrinsicCandidate 1330 public final long getAndAddLong(Object o, long offset, long delta) { 1331 long v; 1332 do { 1333 v = getLongVolatile(o, offset); 1334 } while (!compareAndSwapLong(o, offset, v, v + delta)); 1335 return v; 1336 } 1337 1338 /** 1339 * Atomically exchanges the given value with the current value of 1340 * a field or array element within the given object {@code o} 1341 * at the given {@code offset}. 1342 * 1343 * @param o object/array to update the field/element in 1344 * @param offset field/element offset 1345 * @param newValue new value 1346 * @return the previous value 1347 * @since 1.8 1348 */ 1349 @HotSpotIntrinsicCandidate 1350 public final int getAndSetInt(Object o, long offset, int newValue) { 1351 int v; 1352 do { 1353 v = getIntVolatile(o, offset); 1354 } while (!compareAndSwapInt(o, offset, v, newValue)); 1355 return v; 1356 } 1357 1358 /** 1359 * Atomically exchanges the given value with the current value of 1360 * a field or array element within the given object {@code o} 1361 * at the given {@code offset}. 1362 * 1363 * @param o object/array to update the field/element in 1364 * @param offset field/element offset 1365 * @param newValue new value 1366 * @return the previous value 1367 * @since 1.8 1368 */ 1369 @HotSpotIntrinsicCandidate 1370 public final long getAndSetLong(Object o, long offset, long newValue) { 1371 long v; 1372 do { 1373 v = getLongVolatile(o, offset); 1374 } while (!compareAndSwapLong(o, offset, v, newValue)); 1375 return v; 1376 } 1377 1378 /** 1379 * Atomically exchanges the given reference value with the current 1380 * reference value of a field or array element within the given 1381 * object {@code o} at the given {@code offset}. 1382 * 1383 * @param o object/array to update the field/element in 1384 * @param offset field/element offset 1385 * @param newValue new value 1386 * @return the previous value 1387 * @since 1.8 1388 */ 1389 @HotSpotIntrinsicCandidate 1390 public final Object getAndSetObject(Object o, long offset, Object newValue) { 1391 Object v; 1392 do { 1393 v = getObjectVolatile(o, offset); 1394 } while (!compareAndSwapObject(o, offset, v, newValue)); 1395 return v; 1396 } 1397 1398 1399 /** 1400 * Ensures that loads before the fence will not be reordered with loads and 1401 * stores after the fence; a "LoadLoad plus LoadStore barrier". 1402 * 1403 * Corresponds to C11 atomic_thread_fence(memory_order_acquire) 1404 * (an "acquire fence"). 1405 * 1406 * A pure LoadLoad fence is not provided, since the addition of LoadStore 1407 * is almost always desired, and most current hardware instructions that 1408 * provide a LoadLoad barrier also provide a LoadStore barrier for free. 1409 * @since 1.8 1410 */ 1411 @HotSpotIntrinsicCandidate 1412 public native void loadFence(); 1413 1414 /** 1415 * Ensures that loads and stores before the fence will not be reordered with 1416 * stores after the fence; a "StoreStore plus LoadStore barrier". 1417 * 1418 * Corresponds to C11 atomic_thread_fence(memory_order_release) 1419 * (a "release fence"). 1420 * 1421 * A pure StoreStore fence is not provided, since the addition of LoadStore 1422 * is almost always desired, and most current hardware instructions that 1423 * provide a StoreStore barrier also provide a LoadStore barrier for free. 1424 * @since 1.8 1425 */ 1426 @HotSpotIntrinsicCandidate 1427 public native void storeFence(); 1428 1429 /** 1430 * Ensures that loads and stores before the fence will not be reordered 1431 * with loads and stores after the fence. Implies the effects of both 1432 * loadFence() and storeFence(), and in addition, the effect of a StoreLoad 1433 * barrier. 1434 * 1435 * Corresponds to C11 atomic_thread_fence(memory_order_seq_cst). 1436 * @since 1.8 1437 */ 1438 @HotSpotIntrinsicCandidate 1439 public native void fullFence(); 1440 1441 /** 1442 * Ensures that loads before the fence will not be reordered with 1443 * loads after the fence. 1444 */ 1445 public final void loadLoadFence() { 1446 loadFence(); 1447 } 1448 1449 /** 1450 * Ensures that stores before the fence will not be reordered with 1451 * stores after the fence. 1452 */ 1453 public final void storeStoreFence() { 1454 storeFence(); 1455 } 1456 1457 1458 /** 1459 * Throws IllegalAccessError; for use by the VM for access control 1460 * error support. 1461 * @since 1.8 1462 */ 1463 private static void throwIllegalAccessError() { 1464 throw new IllegalAccessError(); 1465 } 1466 1467 /** 1468 * @return Returns true if the native byte ordering of this 1469 * platform is big-endian, false if it is little-endian. 1470 */ 1471 public final boolean isBigEndian() { return BE; } 1472 1473 /** 1474 * @return Returns true if this platform is capable of performing 1475 * accesses at addresses which are not aligned for the type of the 1476 * primitive type being accessed, false otherwise. 1477 */ 1478 public final boolean unalignedAccess() { return unalignedAccess; } 1479 1480 /** 1481 * Fetches a value at some byte offset into a given Java object. 1482 * More specifically, fetches a value within the given object 1483 * <code>o</code> at the given offset, or (if <code>o</code> is 1484 * null) from the memory address whose numerical value is the 1485 * given offset. <p> 1486 * 1487 * The specification of this method is the same as {@link 1488 * #getLong(Object, long)} except that the offset does not need to 1489 * have been obtained from {@link #objectFieldOffset} on the 1490 * {@link java.lang.reflect.Field} of some Java field. The value 1491 * in memory is raw data, and need not correspond to any Java 1492 * variable. Unless <code>o</code> is null, the value accessed 1493 * must be entirely within the allocated object. The endianness 1494 * of the value in memory is the endianness of the native platform. 1495 * 1496 * <p> The read will be atomic with respect to the largest power 1497 * of two that divides the GCD of the offset and the storage size. 1498 * For example, getLongUnaligned will make atomic reads of 2-, 4-, 1499 * or 8-byte storage units if the offset is zero mod 2, 4, or 8, 1500 * respectively. There are no other guarantees of atomicity. 1501 * <p> 1502 * 8-byte atomicity is only guaranteed on platforms on which 1503 * support atomic accesses to longs. 1504 * 1505 * @param o Java heap object in which the value resides, if any, else 1506 * null 1507 * @param offset The offset in bytes from the start of the object 1508 * @return the value fetched from the indicated object 1509 * @throws RuntimeException No defined exceptions are thrown, not even 1510 * {@link NullPointerException} 1511 * @since 9 1512 */ 1513 @HotSpotIntrinsicCandidate 1514 public final long getLongUnaligned(Object o, long offset) { 1515 if ((offset & 7) == 0) { 1516 return getLong(o, offset); 1517 } else if ((offset & 3) == 0) { 1518 return makeLong(getInt(o, offset), 1519 getInt(o, offset + 4)); 1520 } else if ((offset & 1) == 0) { 1521 return makeLong(getShort(o, offset), 1522 getShort(o, offset + 2), 1523 getShort(o, offset + 4), 1524 getShort(o, offset + 6)); 1525 } else { 1526 return makeLong(getByte(o, offset), 1527 getByte(o, offset + 1), 1528 getByte(o, offset + 2), 1529 getByte(o, offset + 3), 1530 getByte(o, offset + 4), 1531 getByte(o, offset + 5), 1532 getByte(o, offset + 6), 1533 getByte(o, offset + 7)); 1534 } 1535 } 1536 /** 1537 * As {@link #getLongUnaligned(Object, long)} but with an 1538 * additional argument which specifies the endianness of the value 1539 * as stored in memory. 1540 * 1541 * @param o Java heap object in which the variable resides 1542 * @param offset The offset in bytes from the start of the object 1543 * @param bigEndian The endianness of the value 1544 * @return the value fetched from the indicated object 1545 * @since 9 1546 */ 1547 public final long getLongUnaligned(Object o, long offset, boolean bigEndian) { 1548 return convEndian(bigEndian, getLongUnaligned(o, offset)); 1549 } 1550 1551 /** @see #getLongUnaligned(Object, long) */ 1552 @HotSpotIntrinsicCandidate 1553 public final int getIntUnaligned(Object o, long offset) { 1554 if ((offset & 3) == 0) { 1555 return getInt(o, offset); 1556 } else if ((offset & 1) == 0) { 1557 return makeInt(getShort(o, offset), 1558 getShort(o, offset + 2)); 1559 } else { 1560 return makeInt(getByte(o, offset), 1561 getByte(o, offset + 1), 1562 getByte(o, offset + 2), 1563 getByte(o, offset + 3)); 1564 } 1565 } 1566 /** @see #getLongUnaligned(Object, long, boolean) */ 1567 public final int getIntUnaligned(Object o, long offset, boolean bigEndian) { 1568 return convEndian(bigEndian, getIntUnaligned(o, offset)); 1569 } 1570 1571 /** @see #getLongUnaligned(Object, long) */ 1572 @HotSpotIntrinsicCandidate 1573 public final short getShortUnaligned(Object o, long offset) { 1574 if ((offset & 1) == 0) { 1575 return getShort(o, offset); 1576 } else { 1577 return makeShort(getByte(o, offset), 1578 getByte(o, offset + 1)); 1579 } 1580 } 1581 /** @see #getLongUnaligned(Object, long, boolean) */ 1582 public final short getShortUnaligned(Object o, long offset, boolean bigEndian) { 1583 return convEndian(bigEndian, getShortUnaligned(o, offset)); 1584 } 1585 1586 /** @see #getLongUnaligned(Object, long) */ 1587 @HotSpotIntrinsicCandidate 1588 public final char getCharUnaligned(Object o, long offset) { 1589 if ((offset & 1) == 0) { 1590 return getChar(o, offset); 1591 } else { 1592 return (char)makeShort(getByte(o, offset), 1593 getByte(o, offset + 1)); 1594 } 1595 } 1596 1597 /** @see #getLongUnaligned(Object, long, boolean) */ 1598 public final char getCharUnaligned(Object o, long offset, boolean bigEndian) { 1599 return convEndian(bigEndian, getCharUnaligned(o, offset)); 1600 } 1601 1602 /** 1603 * Stores a value at some byte offset into a given Java object. 1604 * <p> 1605 * The specification of this method is the same as {@link 1606 * #getLong(Object, long)} except that the offset does not need to 1607 * have been obtained from {@link #objectFieldOffset} on the 1608 * {@link java.lang.reflect.Field} of some Java field. The value 1609 * in memory is raw data, and need not correspond to any Java 1610 * variable. The endianness of the value in memory is the 1611 * endianness of the native platform. 1612 * <p> 1613 * The write will be atomic with respect to the largest power of 1614 * two that divides the GCD of the offset and the storage size. 1615 * For example, putLongUnaligned will make atomic writes of 2-, 4-, 1616 * or 8-byte storage units if the offset is zero mod 2, 4, or 8, 1617 * respectively. There are no other guarantees of atomicity. 1618 * <p> 1619 * 8-byte atomicity is only guaranteed on platforms on which 1620 * support atomic accesses to longs. 1621 * 1622 * @param o Java heap object in which the value resides, if any, else 1623 * null 1624 * @param offset The offset in bytes from the start of the object 1625 * @param x the value to store 1626 * @throws RuntimeException No defined exceptions are thrown, not even 1627 * {@link NullPointerException} 1628 * @since 9 1629 */ 1630 @HotSpotIntrinsicCandidate 1631 public final void putLongUnaligned(Object o, long offset, long x) { 1632 if ((offset & 7) == 0) { 1633 putLong(o, offset, x); 1634 } else if ((offset & 3) == 0) { 1635 putLongParts(o, offset, 1636 (int)(x >> 0), 1637 (int)(x >>> 32)); 1638 } else if ((offset & 1) == 0) { 1639 putLongParts(o, offset, 1640 (short)(x >>> 0), 1641 (short)(x >>> 16), 1642 (short)(x >>> 32), 1643 (short)(x >>> 48)); 1644 } else { 1645 putLongParts(o, offset, 1646 (byte)(x >>> 0), 1647 (byte)(x >>> 8), 1648 (byte)(x >>> 16), 1649 (byte)(x >>> 24), 1650 (byte)(x >>> 32), 1651 (byte)(x >>> 40), 1652 (byte)(x >>> 48), 1653 (byte)(x >>> 56)); 1654 } 1655 } 1656 1657 /** 1658 * As {@link #putLongUnaligned(Object, long, long)} but with an additional 1659 * argument which specifies the endianness of the value as stored in memory. 1660 * @param o Java heap object in which the value resides 1661 * @param offset The offset in bytes from the start of the object 1662 * @param x the value to store 1663 * @param bigEndian The endianness of the value 1664 * @throws RuntimeException No defined exceptions are thrown, not even 1665 * {@link NullPointerException} 1666 * @since 9 1667 */ 1668 public final void putLongUnaligned(Object o, long offset, long x, boolean bigEndian) { 1669 putLongUnaligned(o, offset, convEndian(bigEndian, x)); 1670 } 1671 1672 /** @see #putLongUnaligned(Object, long, long) */ 1673 @HotSpotIntrinsicCandidate 1674 public final void putIntUnaligned(Object o, long offset, int x) { 1675 if ((offset & 3) == 0) { 1676 putInt(o, offset, x); 1677 } else if ((offset & 1) == 0) { 1678 putIntParts(o, offset, 1679 (short)(x >> 0), 1680 (short)(x >>> 16)); 1681 } else { 1682 putIntParts(o, offset, 1683 (byte)(x >>> 0), 1684 (byte)(x >>> 8), 1685 (byte)(x >>> 16), 1686 (byte)(x >>> 24)); 1687 } 1688 } 1689 /** @see #putLongUnaligned(Object, long, long, boolean) */ 1690 public final void putIntUnaligned(Object o, long offset, int x, boolean bigEndian) { 1691 putIntUnaligned(o, offset, convEndian(bigEndian, x)); 1692 } 1693 1694 /** @see #putLongUnaligned(Object, long, long) */ 1695 @HotSpotIntrinsicCandidate 1696 public final void putShortUnaligned(Object o, long offset, short x) { 1697 if ((offset & 1) == 0) { 1698 putShort(o, offset, x); 1699 } else { 1700 putShortParts(o, offset, 1701 (byte)(x >>> 0), 1702 (byte)(x >>> 8)); 1703 } 1704 } 1705 /** @see #putLongUnaligned(Object, long, long, boolean) */ 1706 public final void putShortUnaligned(Object o, long offset, short x, boolean bigEndian) { 1707 putShortUnaligned(o, offset, convEndian(bigEndian, x)); 1708 } 1709 1710 /** @see #putLongUnaligned(Object, long, long) */ 1711 @HotSpotIntrinsicCandidate 1712 public final void putCharUnaligned(Object o, long offset, char x) { 1713 putShortUnaligned(o, offset, (short)x); 1714 } 1715 /** @see #putLongUnaligned(Object, long, long, boolean) */ 1716 public final void putCharUnaligned(Object o, long offset, char x, boolean bigEndian) { 1717 putCharUnaligned(o, offset, convEndian(bigEndian, x)); 1718 } 1719 1720 // JVM interface methods 1721 private native boolean unalignedAccess0(); 1722 private native boolean isBigEndian0(); 1723 1724 // BE is true iff the native endianness of this platform is big. 1725 private static final boolean BE = theUnsafe.isBigEndian0(); 1726 1727 // unalignedAccess is true iff this platform can perform unaligned accesses. 1728 private static final boolean unalignedAccess = theUnsafe.unalignedAccess0(); 1729 1730 private static int pickPos(int top, int pos) { return BE ? top - pos : pos; } 1731 1732 // These methods construct integers from bytes. The byte ordering 1733 // is the native endianness of this platform. 1734 private static long makeLong(byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) { 1735 return ((toUnsignedLong(i0) << pickPos(56, 0)) 1736 | (toUnsignedLong(i1) << pickPos(56, 8)) 1737 | (toUnsignedLong(i2) << pickPos(56, 16)) 1738 | (toUnsignedLong(i3) << pickPos(56, 24)) 1739 | (toUnsignedLong(i4) << pickPos(56, 32)) 1740 | (toUnsignedLong(i5) << pickPos(56, 40)) 1741 | (toUnsignedLong(i6) << pickPos(56, 48)) 1742 | (toUnsignedLong(i7) << pickPos(56, 56))); 1743 } 1744 private static long makeLong(short i0, short i1, short i2, short i3) { 1745 return ((toUnsignedLong(i0) << pickPos(48, 0)) 1746 | (toUnsignedLong(i1) << pickPos(48, 16)) 1747 | (toUnsignedLong(i2) << pickPos(48, 32)) 1748 | (toUnsignedLong(i3) << pickPos(48, 48))); 1749 } 1750 private static long makeLong(int i0, int i1) { 1751 return (toUnsignedLong(i0) << pickPos(32, 0)) 1752 | (toUnsignedLong(i1) << pickPos(32, 32)); 1753 } 1754 private static int makeInt(short i0, short i1) { 1755 return (toUnsignedInt(i0) << pickPos(16, 0)) 1756 | (toUnsignedInt(i1) << pickPos(16, 16)); 1757 } 1758 private static int makeInt(byte i0, byte i1, byte i2, byte i3) { 1759 return ((toUnsignedInt(i0) << pickPos(24, 0)) 1760 | (toUnsignedInt(i1) << pickPos(24, 8)) 1761 | (toUnsignedInt(i2) << pickPos(24, 16)) 1762 | (toUnsignedInt(i3) << pickPos(24, 24))); 1763 } 1764 private static short makeShort(byte i0, byte i1) { 1765 return (short)((toUnsignedInt(i0) << pickPos(8, 0)) 1766 | (toUnsignedInt(i1) << pickPos(8, 8))); 1767 } 1768 1769 private static byte pick(byte le, byte be) { return BE ? be : le; } 1770 private static short pick(short le, short be) { return BE ? be : le; } 1771 private static int pick(int le, int be) { return BE ? be : le; } 1772 1773 // These methods write integers to memory from smaller parts 1774 // provided by their caller. The ordering in which these parts 1775 // are written is the native endianness of this platform. 1776 private void putLongParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) { 1777 putByte(o, offset + 0, pick(i0, i7)); 1778 putByte(o, offset + 1, pick(i1, i6)); 1779 putByte(o, offset + 2, pick(i2, i5)); 1780 putByte(o, offset + 3, pick(i3, i4)); 1781 putByte(o, offset + 4, pick(i4, i3)); 1782 putByte(o, offset + 5, pick(i5, i2)); 1783 putByte(o, offset + 6, pick(i6, i1)); 1784 putByte(o, offset + 7, pick(i7, i0)); 1785 } 1786 private void putLongParts(Object o, long offset, short i0, short i1, short i2, short i3) { 1787 putShort(o, offset + 0, pick(i0, i3)); 1788 putShort(o, offset + 2, pick(i1, i2)); 1789 putShort(o, offset + 4, pick(i2, i1)); 1790 putShort(o, offset + 6, pick(i3, i0)); 1791 } 1792 private void putLongParts(Object o, long offset, int i0, int i1) { 1793 putInt(o, offset + 0, pick(i0, i1)); 1794 putInt(o, offset + 4, pick(i1, i0)); 1795 } 1796 private void putIntParts(Object o, long offset, short i0, short i1) { 1797 putShort(o, offset + 0, pick(i0, i1)); 1798 putShort(o, offset + 2, pick(i1, i0)); 1799 } 1800 private void putIntParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3) { 1801 putByte(o, offset + 0, pick(i0, i3)); 1802 putByte(o, offset + 1, pick(i1, i2)); 1803 putByte(o, offset + 2, pick(i2, i1)); 1804 putByte(o, offset + 3, pick(i3, i0)); 1805 } 1806 private void putShortParts(Object o, long offset, byte i0, byte i1) { 1807 putByte(o, offset + 0, pick(i0, i1)); 1808 putByte(o, offset + 1, pick(i1, i0)); 1809 } 1810 1811 // Zero-extend an integer 1812 private static int toUnsignedInt(byte n) { return n & 0xff; } 1813 private static int toUnsignedInt(short n) { return n & 0xffff; } 1814 private static long toUnsignedLong(byte n) { return n & 0xffl; } 1815 private static long toUnsignedLong(short n) { return n & 0xffffl; } 1816 private static long toUnsignedLong(int n) { return n & 0xffffffffl; } 1817 1818 // Maybe byte-reverse an integer 1819 private static char convEndian(boolean big, char n) { return big == BE ? n : Character.reverseBytes(n); } 1820 private static short convEndian(boolean big, short n) { return big == BE ? n : Short.reverseBytes(n) ; } 1821 private static int convEndian(boolean big, int n) { return big == BE ? n : Integer.reverseBytes(n) ; } 1822 private static long convEndian(boolean big, long n) { return big == BE ? n : Long.reverseBytes(n) ; } 1823 }