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 /** 472 * Copies all elements from one block of memory to another block, 473 * *unconditionally* byte swapping the elements on the fly. 474 * 475 * <p>This method determines each block's base address by means of two parameters, 476 * and so it provides (in effect) a <em>double-register</em> addressing mode, 477 * as discussed in {@link #getInt(Object,long)}. When the object reference is null, 478 * the offset supplies an absolute base address. 479 * 480 * @since 9 481 */ 482 public void copySwapMemory(Object srcBase, long srcOffset, 483 Object destBase, long destOffset, 484 long bytes, long elemSize) { 485 if (bytes < 0 || srcOffset < 0 || destOffset < 0) { 486 throw new IllegalArgumentException(); 487 } 488 if (elemSize != 2 && elemSize != 4 && elemSize != 8) { 489 throw new IllegalArgumentException(); 490 } 491 if (bytes % elemSize != 0) { 492 throw new IllegalArgumentException(); 493 } 494 if ((srcBase == null && srcOffset == 0) || 495 (destBase == null && destOffset == 0)) { 496 throw new NullPointerException(); 497 } 498 499 // Must be off-heap, or primitive heap arrays 500 if ((srcBase != null && !isPrimitiveArray(srcBase.getClass())) || 501 (destBase != null && !isPrimitiveArray(destBase.getClass()))) { 502 throw new IllegalArgumentException(); 503 } 504 505 // Sanity check size and offsets on 32-bit platforms. Most 506 // significant 32 bits must be zero. 507 if (ADDRESS_SIZE == 4 && 508 (bytes >>> 32 != 0 || srcOffset >>> 32 != 0 || destOffset >>> 32 != 0)) { 509 throw new IllegalArgumentException(); 510 } 511 512 if (bytes == 0) { 513 return; 514 } 515 516 copySwapMemory0(srcBase, srcOffset, destBase, destOffset, bytes, elemSize); 517 } 518 519 /** 520 * Copies all elements from one block of memory to another block, byte swapping the 521 * elements on the fly. 522 * 523 * This provides a <em>single-register</em> addressing mode, as 524 * discussed in {@link #getInt(Object,long)}. 525 * 526 * Equivalent to {@code copySwapMemory(null, srcAddress, null, destAddress, bytes, elemSize)}. 527 */ 528 public void copySwapMemory(long srcAddress, long destAddress, long bytes, long elemSize) { 529 copySwapMemory(null, srcAddress, null, destAddress, bytes, elemSize); 530 } 531 532 /** 533 * Disposes of a block of native memory, as obtained from {@link 534 * #allocateMemory} or {@link #reallocateMemory}. The address passed to 535 * this method may be null, in which case no action is taken. 536 * 537 * @see #allocateMemory 538 */ 539 public native void freeMemory(long address); 540 541 /// random queries 542 543 /** 544 * This constant differs from all results that will ever be returned from 545 * {@link #staticFieldOffset}, {@link #objectFieldOffset}, 546 * or {@link #arrayBaseOffset}. 547 */ 548 public static final int INVALID_FIELD_OFFSET = -1; 549 550 /** 551 * Reports the location of a given field in the storage allocation of its 552 * class. Do not expect to perform any sort of arithmetic on this offset; 553 * it is just a cookie which is passed to the unsafe heap memory accessors. 554 * 555 * <p>Any given field will always have the same offset and base, and no 556 * two distinct fields of the same class will ever have the same offset 557 * and base. 558 * 559 * <p>As of 1.4.1, offsets for fields are represented as long values, 560 * although the Sun JVM does not use the most significant 32 bits. 561 * However, JVM implementations which store static fields at absolute 562 * addresses can use long offsets and null base pointers to express 563 * the field locations in a form usable by {@link #getInt(Object,long)}. 564 * Therefore, code which will be ported to such JVMs on 64-bit platforms 565 * must preserve all bits of static field offsets. 566 * @see #getInt(Object, long) 567 */ 568 public native long objectFieldOffset(Field f); 569 570 /** 571 * Reports the location of a given static field, in conjunction with {@link 572 * #staticFieldBase}. 573 * <p>Do not expect to perform any sort of arithmetic on this offset; 574 * it is just a cookie which is passed to the unsafe heap memory accessors. 575 * 576 * <p>Any given field will always have the same offset, and no two distinct 577 * fields of the same class will ever have the same offset. 578 * 579 * <p>As of 1.4.1, offsets for fields are represented as long values, 580 * although the Sun JVM does not use the most significant 32 bits. 581 * It is hard to imagine a JVM technology which needs more than 582 * a few bits to encode an offset within a non-array object, 583 * However, for consistency with other methods in this class, 584 * this method reports its result as a long value. 585 * @see #getInt(Object, long) 586 */ 587 public native long staticFieldOffset(Field f); 588 589 /** 590 * Reports the location of a given static field, in conjunction with {@link 591 * #staticFieldOffset}. 592 * <p>Fetch the base "Object", if any, with which static fields of the 593 * given class can be accessed via methods like {@link #getInt(Object, 594 * long)}. This value may be null. This value may refer to an object 595 * which is a "cookie", not guaranteed to be a real Object, and it should 596 * not be used in any way except as argument to the get and put routines in 597 * this class. 598 */ 599 public native Object staticFieldBase(Field f); 600 601 /** 602 * Detects if the given class may need to be initialized. This is often 603 * needed in conjunction with obtaining the static field base of a 604 * class. 605 * @return false only if a call to {@code ensureClassInitialized} would have no effect 606 */ 607 public native boolean shouldBeInitialized(Class<?> c); 608 609 /** 610 * Ensures the given class has been initialized. This is often 611 * needed in conjunction with obtaining the static field base of a 612 * class. 613 */ 614 public native void ensureClassInitialized(Class<?> c); 615 616 /** 617 * Reports the offset of the first element in the storage allocation of a 618 * given array class. If {@link #arrayIndexScale} returns a non-zero value 619 * for the same class, you may use that scale factor, together with this 620 * base offset, to form new offsets to access elements of arrays of the 621 * given class. 622 * 623 * @see #getInt(Object, long) 624 * @see #putInt(Object, long, int) 625 */ 626 public native int arrayBaseOffset(Class<?> arrayClass); 627 628 /** The value of {@code arrayBaseOffset(boolean[].class)} */ 629 public static final int ARRAY_BOOLEAN_BASE_OFFSET 630 = theUnsafe.arrayBaseOffset(boolean[].class); 631 632 /** The value of {@code arrayBaseOffset(byte[].class)} */ 633 public static final int ARRAY_BYTE_BASE_OFFSET 634 = theUnsafe.arrayBaseOffset(byte[].class); 635 636 /** The value of {@code arrayBaseOffset(short[].class)} */ 637 public static final int ARRAY_SHORT_BASE_OFFSET 638 = theUnsafe.arrayBaseOffset(short[].class); 639 640 /** The value of {@code arrayBaseOffset(char[].class)} */ 641 public static final int ARRAY_CHAR_BASE_OFFSET 642 = theUnsafe.arrayBaseOffset(char[].class); 643 644 /** The value of {@code arrayBaseOffset(int[].class)} */ 645 public static final int ARRAY_INT_BASE_OFFSET 646 = theUnsafe.arrayBaseOffset(int[].class); 647 648 /** The value of {@code arrayBaseOffset(long[].class)} */ 649 public static final int ARRAY_LONG_BASE_OFFSET 650 = theUnsafe.arrayBaseOffset(long[].class); 651 652 /** The value of {@code arrayBaseOffset(float[].class)} */ 653 public static final int ARRAY_FLOAT_BASE_OFFSET 654 = theUnsafe.arrayBaseOffset(float[].class); 655 656 /** The value of {@code arrayBaseOffset(double[].class)} */ 657 public static final int ARRAY_DOUBLE_BASE_OFFSET 658 = theUnsafe.arrayBaseOffset(double[].class); 659 660 /** The value of {@code arrayBaseOffset(Object[].class)} */ 661 public static final int ARRAY_OBJECT_BASE_OFFSET 662 = theUnsafe.arrayBaseOffset(Object[].class); 663 664 /** 665 * Reports the scale factor for addressing elements in the storage 666 * allocation of a given array class. However, arrays of "narrow" types 667 * will generally not work properly with accessors like {@link 668 * #getByte(Object, long)}, so the scale factor for such classes is reported 669 * as zero. 670 * 671 * @see #arrayBaseOffset 672 * @see #getInt(Object, long) 673 * @see #putInt(Object, long, int) 674 */ 675 public native int arrayIndexScale(Class<?> arrayClass); 676 677 /** The value of {@code arrayIndexScale(boolean[].class)} */ 678 public static final int ARRAY_BOOLEAN_INDEX_SCALE 679 = theUnsafe.arrayIndexScale(boolean[].class); 680 681 /** The value of {@code arrayIndexScale(byte[].class)} */ 682 public static final int ARRAY_BYTE_INDEX_SCALE 683 = theUnsafe.arrayIndexScale(byte[].class); 684 685 /** The value of {@code arrayIndexScale(short[].class)} */ 686 public static final int ARRAY_SHORT_INDEX_SCALE 687 = theUnsafe.arrayIndexScale(short[].class); 688 689 /** The value of {@code arrayIndexScale(char[].class)} */ 690 public static final int ARRAY_CHAR_INDEX_SCALE 691 = theUnsafe.arrayIndexScale(char[].class); 692 693 /** The value of {@code arrayIndexScale(int[].class)} */ 694 public static final int ARRAY_INT_INDEX_SCALE 695 = theUnsafe.arrayIndexScale(int[].class); 696 697 /** The value of {@code arrayIndexScale(long[].class)} */ 698 public static final int ARRAY_LONG_INDEX_SCALE 699 = theUnsafe.arrayIndexScale(long[].class); 700 701 /** The value of {@code arrayIndexScale(float[].class)} */ 702 public static final int ARRAY_FLOAT_INDEX_SCALE 703 = theUnsafe.arrayIndexScale(float[].class); 704 705 /** The value of {@code arrayIndexScale(double[].class)} */ 706 public static final int ARRAY_DOUBLE_INDEX_SCALE 707 = theUnsafe.arrayIndexScale(double[].class); 708 709 /** The value of {@code arrayIndexScale(Object[].class)} */ 710 public static final int ARRAY_OBJECT_INDEX_SCALE 711 = theUnsafe.arrayIndexScale(Object[].class); 712 713 /** 714 * Reports the size in bytes of a native pointer, as stored via {@link 715 * #putAddress}. This value will be either 4 or 8. Note that the sizes of 716 * other primitive types (as stored in native memory blocks) is determined 717 * fully by their information content. 718 */ 719 public native int addressSize(); 720 721 /** The value of {@code addressSize()} */ 722 public static final int ADDRESS_SIZE = theUnsafe.addressSize(); 723 724 /** 725 * Reports the size in bytes of a native memory page (whatever that is). 726 * This value will always be a power of two. 727 */ 728 public native int pageSize(); 729 730 731 /// random trusted operations from JNI: 732 733 /** 734 * Tells the VM to define a class, without security checks. By default, the 735 * class loader and protection domain come from the caller's class. 736 */ 737 public native Class<?> defineClass(String name, byte[] b, int off, int len, 738 ClassLoader loader, 739 ProtectionDomain protectionDomain); 740 741 /** 742 * Defines a class but does not make it known to the class loader or system dictionary. 743 * <p> 744 * For each CP entry, the corresponding CP patch must either be null or have 745 * the a format that matches its tag: 746 * <ul> 747 * <li>Integer, Long, Float, Double: the corresponding wrapper object type from java.lang 748 * <li>Utf8: a string (must have suitable syntax if used as signature or name) 749 * <li>Class: any java.lang.Class object 750 * <li>String: any object (not just a java.lang.String) 751 * <li>InterfaceMethodRef: (NYI) a method handle to invoke on that call site's arguments 752 * </ul> 753 * @param hostClass context for linkage, access control, protection domain, and class loader 754 * @param data bytes of a class file 755 * @param cpPatches where non-null entries exist, they replace corresponding CP entries in data 756 */ 757 public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches); 758 759 /** 760 * Allocates an instance but does not run any constructor. 761 * Initializes the class if it has not yet been. 762 */ 763 @HotSpotIntrinsicCandidate 764 public native Object allocateInstance(Class<?> cls) 765 throws InstantiationException; 766 767 /** Throws the exception without telling the verifier. */ 768 public native void throwException(Throwable ee); 769 770 /** 771 * Atomically updates Java variable to {@code x} if it is currently 772 * holding {@code expected}. 773 * 774 * <p>This operation has memory semantics of a {@code volatile} read 775 * and write. Corresponds to C11 atomic_compare_exchange_strong. 776 * 777 * @return {@code true} if successful 778 */ 779 @HotSpotIntrinsicCandidate 780 public final native boolean compareAndSwapObject(Object o, long offset, 781 Object expected, 782 Object x); 783 784 /** 785 * Atomically updates Java variable to {@code x} if it is currently 786 * holding {@code expected}. 787 * 788 * <p>This operation has memory semantics of a {@code volatile} read 789 * and write. Corresponds to C11 atomic_compare_exchange_strong. 790 * 791 * @return {@code true} if successful 792 */ 793 @HotSpotIntrinsicCandidate 794 public final native boolean compareAndSwapInt(Object o, long offset, 795 int expected, 796 int x); 797 798 /** 799 * Atomically updates Java variable to {@code x} if it is currently 800 * holding {@code expected}. 801 * 802 * <p>This operation has memory semantics of a {@code volatile} read 803 * and write. Corresponds to C11 atomic_compare_exchange_strong. 804 * 805 * @return {@code true} if successful 806 */ 807 @HotSpotIntrinsicCandidate 808 public final native boolean compareAndSwapLong(Object o, long offset, 809 long expected, 810 long x); 811 812 /** 813 * Fetches a reference value from a given Java variable, with volatile 814 * load semantics. Otherwise identical to {@link #getObject(Object, long)} 815 */ 816 @HotSpotIntrinsicCandidate 817 public native Object getObjectVolatile(Object o, long offset); 818 819 /** 820 * Stores a reference value into a given Java variable, with 821 * volatile store semantics. Otherwise identical to {@link #putObject(Object, long, Object)} 822 */ 823 @HotSpotIntrinsicCandidate 824 public native void putObjectVolatile(Object o, long offset, Object x); 825 826 /** Volatile version of {@link #getInt(Object, long)} */ 827 @HotSpotIntrinsicCandidate 828 public native int getIntVolatile(Object o, long offset); 829 830 /** Volatile version of {@link #putInt(Object, long, int)} */ 831 @HotSpotIntrinsicCandidate 832 public native void putIntVolatile(Object o, long offset, int x); 833 834 /** Volatile version of {@link #getBoolean(Object, long)} */ 835 @HotSpotIntrinsicCandidate 836 public native boolean getBooleanVolatile(Object o, long offset); 837 838 /** Volatile version of {@link #putBoolean(Object, long, boolean)} */ 839 @HotSpotIntrinsicCandidate 840 public native void putBooleanVolatile(Object o, long offset, boolean x); 841 842 /** Volatile version of {@link #getByte(Object, long)} */ 843 @HotSpotIntrinsicCandidate 844 public native byte getByteVolatile(Object o, long offset); 845 846 /** Volatile version of {@link #putByte(Object, long, byte)} */ 847 @HotSpotIntrinsicCandidate 848 public native void putByteVolatile(Object o, long offset, byte x); 849 850 /** Volatile version of {@link #getShort(Object, long)} */ 851 @HotSpotIntrinsicCandidate 852 public native short getShortVolatile(Object o, long offset); 853 854 /** Volatile version of {@link #putShort(Object, long, short)} */ 855 @HotSpotIntrinsicCandidate 856 public native void putShortVolatile(Object o, long offset, short x); 857 858 /** Volatile version of {@link #getChar(Object, long)} */ 859 @HotSpotIntrinsicCandidate 860 public native char getCharVolatile(Object o, long offset); 861 862 /** Volatile version of {@link #putChar(Object, long, char)} */ 863 @HotSpotIntrinsicCandidate 864 public native void putCharVolatile(Object o, long offset, char x); 865 866 /** Volatile version of {@link #getLong(Object, long)} */ 867 @HotSpotIntrinsicCandidate 868 public native long getLongVolatile(Object o, long offset); 869 870 /** Volatile version of {@link #putLong(Object, long, long)} */ 871 @HotSpotIntrinsicCandidate 872 public native void putLongVolatile(Object o, long offset, long x); 873 874 /** Volatile version of {@link #getFloat(Object, long)} */ 875 @HotSpotIntrinsicCandidate 876 public native float getFloatVolatile(Object o, long offset); 877 878 /** Volatile version of {@link #putFloat(Object, long, float)} */ 879 @HotSpotIntrinsicCandidate 880 public native void putFloatVolatile(Object o, long offset, float x); 881 882 /** Volatile version of {@link #getDouble(Object, long)} */ 883 @HotSpotIntrinsicCandidate 884 public native double getDoubleVolatile(Object o, long offset); 885 886 /** Volatile version of {@link #putDouble(Object, long, double)} */ 887 @HotSpotIntrinsicCandidate 888 public native void putDoubleVolatile(Object o, long offset, double x); 889 890 /** 891 * Version of {@link #putObjectVolatile(Object, long, Object)} 892 * that does not guarantee immediate visibility of the store to 893 * other threads. This method is generally only useful if the 894 * underlying field is a Java volatile (or if an array cell, one 895 * that is otherwise only accessed using volatile accesses). 896 * 897 * Corresponds to C11 atomic_store_explicit(..., memory_order_release). 898 */ 899 @HotSpotIntrinsicCandidate 900 public native void putOrderedObject(Object o, long offset, Object x); 901 902 /** Ordered/Lazy version of {@link #putIntVolatile(Object, long, int)} */ 903 @HotSpotIntrinsicCandidate 904 public native void putOrderedInt(Object o, long offset, int x); 905 906 /** Ordered/Lazy version of {@link #putLongVolatile(Object, long, long)} */ 907 @HotSpotIntrinsicCandidate 908 public native void putOrderedLong(Object o, long offset, long x); 909 910 /** 911 * Unblocks the given thread blocked on {@code park}, or, if it is 912 * not blocked, causes the subsequent call to {@code park} not to 913 * block. Note: this operation is "unsafe" solely because the 914 * caller must somehow ensure that the thread has not been 915 * destroyed. Nothing special is usually required to ensure this 916 * when called from Java (in which there will ordinarily be a live 917 * reference to the thread) but this is not nearly-automatically 918 * so when calling from native code. 919 * 920 * @param thread the thread to unpark. 921 */ 922 @HotSpotIntrinsicCandidate 923 public native void unpark(Object thread); 924 925 /** 926 * Blocks current thread, returning when a balancing 927 * {@code unpark} occurs, or a balancing {@code unpark} has 928 * already occurred, or the thread is interrupted, or, if not 929 * absolute and time is not zero, the given time nanoseconds have 930 * elapsed, or if absolute, the given deadline in milliseconds 931 * since Epoch has passed, or spuriously (i.e., returning for no 932 * "reason"). Note: This operation is in the Unsafe class only 933 * because {@code unpark} is, so it would be strange to place it 934 * elsewhere. 935 */ 936 @HotSpotIntrinsicCandidate 937 public native void park(boolean isAbsolute, long time); 938 939 /** 940 * Gets the load average in the system run queue assigned 941 * to the available processors averaged over various periods of time. 942 * This method retrieves the given {@code nelem} samples and 943 * assigns to the elements of the given {@code loadavg} array. 944 * The system imposes a maximum of 3 samples, representing 945 * averages over the last 1, 5, and 15 minutes, respectively. 946 * 947 * @param loadavg an array of double of size nelems 948 * @param nelems the number of samples to be retrieved and 949 * must be 1 to 3. 950 * 951 * @return the number of samples actually retrieved; or -1 952 * if the load average is unobtainable. 953 */ 954 public native int getLoadAverage(double[] loadavg, int nelems); 955 956 // The following contain CAS-based Java implementations used on 957 // platforms not supporting native instructions 958 959 /** 960 * Atomically adds the given value to the current value of a field 961 * or array element within the given object {@code o} 962 * at the given {@code offset}. 963 * 964 * @param o object/array to update the field/element in 965 * @param offset field/element offset 966 * @param delta the value to add 967 * @return the previous value 968 * @since 1.8 969 */ 970 @HotSpotIntrinsicCandidate 971 public final int getAndAddInt(Object o, long offset, int delta) { 972 int v; 973 do { 974 v = getIntVolatile(o, offset); 975 } while (!compareAndSwapInt(o, offset, v, v + delta)); 976 return v; 977 } 978 979 /** 980 * Atomically adds the given value to the current value of a field 981 * or array element within the given object {@code o} 982 * at the given {@code offset}. 983 * 984 * @param o object/array to update the field/element in 985 * @param offset field/element offset 986 * @param delta the value to add 987 * @return the previous value 988 * @since 1.8 989 */ 990 @HotSpotIntrinsicCandidate 991 public final long getAndAddLong(Object o, long offset, long delta) { 992 long v; 993 do { 994 v = getLongVolatile(o, offset); 995 } while (!compareAndSwapLong(o, offset, v, v + delta)); 996 return v; 997 } 998 999 /** 1000 * Atomically exchanges the given value with the current value of 1001 * a field or array element within the given object {@code o} 1002 * at the given {@code offset}. 1003 * 1004 * @param o object/array to update the field/element in 1005 * @param offset field/element offset 1006 * @param newValue new value 1007 * @return the previous value 1008 * @since 1.8 1009 */ 1010 @HotSpotIntrinsicCandidate 1011 public final int getAndSetInt(Object o, long offset, int newValue) { 1012 int v; 1013 do { 1014 v = getIntVolatile(o, offset); 1015 } while (!compareAndSwapInt(o, offset, v, newValue)); 1016 return v; 1017 } 1018 1019 /** 1020 * Atomically exchanges the given value with the current value of 1021 * a field or array element within the given object {@code o} 1022 * at the given {@code offset}. 1023 * 1024 * @param o object/array to update the field/element in 1025 * @param offset field/element offset 1026 * @param newValue new value 1027 * @return the previous value 1028 * @since 1.8 1029 */ 1030 @HotSpotIntrinsicCandidate 1031 public final long getAndSetLong(Object o, long offset, long newValue) { 1032 long v; 1033 do { 1034 v = getLongVolatile(o, offset); 1035 } while (!compareAndSwapLong(o, offset, v, newValue)); 1036 return v; 1037 } 1038 1039 /** 1040 * Atomically exchanges the given reference value with the current 1041 * reference value of a field or array element within the given 1042 * object {@code o} at the given {@code offset}. 1043 * 1044 * @param o object/array to update the field/element in 1045 * @param offset field/element offset 1046 * @param newValue new value 1047 * @return the previous value 1048 * @since 1.8 1049 */ 1050 @HotSpotIntrinsicCandidate 1051 public final Object getAndSetObject(Object o, long offset, Object newValue) { 1052 Object v; 1053 do { 1054 v = getObjectVolatile(o, offset); 1055 } while (!compareAndSwapObject(o, offset, v, newValue)); 1056 return v; 1057 } 1058 1059 1060 /** 1061 * Ensures that loads before the fence will not be reordered with loads and 1062 * stores after the fence; a "LoadLoad plus LoadStore barrier". 1063 * 1064 * Corresponds to C11 atomic_thread_fence(memory_order_acquire) 1065 * (an "acquire fence"). 1066 * 1067 * A pure LoadLoad fence is not provided, since the addition of LoadStore 1068 * is almost always desired, and most current hardware instructions that 1069 * provide a LoadLoad barrier also provide a LoadStore barrier for free. 1070 * @since 1.8 1071 */ 1072 @HotSpotIntrinsicCandidate 1073 public native void loadFence(); 1074 1075 /** 1076 * Ensures that loads and stores before the fence will not be reordered with 1077 * stores after the fence; a "StoreStore plus LoadStore barrier". 1078 * 1079 * Corresponds to C11 atomic_thread_fence(memory_order_release) 1080 * (a "release fence"). 1081 * 1082 * A pure StoreStore fence is not provided, since the addition of LoadStore 1083 * is almost always desired, and most current hardware instructions that 1084 * provide a StoreStore barrier also provide a LoadStore barrier for free. 1085 * @since 1.8 1086 */ 1087 @HotSpotIntrinsicCandidate 1088 public native void storeFence(); 1089 1090 /** 1091 * Ensures that loads and stores before the fence will not be reordered 1092 * with loads and stores after the fence. Implies the effects of both 1093 * loadFence() and storeFence(), and in addition, the effect of a StoreLoad 1094 * barrier. 1095 * 1096 * Corresponds to C11 atomic_thread_fence(memory_order_seq_cst). 1097 * @since 1.8 1098 */ 1099 @HotSpotIntrinsicCandidate 1100 public native void fullFence(); 1101 1102 /** 1103 * Throws IllegalAccessError; for use by the VM for access control 1104 * error support. 1105 * @since 1.8 1106 */ 1107 private static void throwIllegalAccessError() { 1108 throw new IllegalAccessError(); 1109 } 1110 1111 /** 1112 * @return Returns true if the native byte ordering of this 1113 * platform is big-endian, false if it is little-endian. 1114 */ 1115 public final boolean isBigEndian() { return BE; } 1116 1117 /** 1118 * @return Returns true if this platform is capable of performing 1119 * accesses at addresses which are not aligned for the type of the 1120 * primitive type being accessed, false otherwise. 1121 */ 1122 public final boolean unalignedAccess() { return unalignedAccess; } 1123 1124 /** 1125 * Fetches a value at some byte offset into a given Java object. 1126 * More specifically, fetches a value within the given object 1127 * <code>o</code> at the given offset, or (if <code>o</code> is 1128 * null) from the memory address whose numerical value is the 1129 * given offset. <p> 1130 * 1131 * The specification of this method is the same as {@link 1132 * #getLong(Object, long)} except that the offset does not need to 1133 * have been obtained from {@link #objectFieldOffset} on the 1134 * {@link java.lang.reflect.Field} of some Java field. The value 1135 * in memory is raw data, and need not correspond to any Java 1136 * variable. Unless <code>o</code> is null, the value accessed 1137 * must be entirely within the allocated object. The endianness 1138 * of the value in memory is the endianness of the native platform. 1139 * 1140 * <p> The read will be atomic with respect to the largest power 1141 * of two that divides the GCD of the offset and the storage size. 1142 * For example, getLongUnaligned will make atomic reads of 2-, 4-, 1143 * or 8-byte storage units if the offset is zero mod 2, 4, or 8, 1144 * respectively. There are no other guarantees of atomicity. 1145 * <p> 1146 * 8-byte atomicity is only guaranteed on platforms on which 1147 * support atomic accesses to longs. 1148 * 1149 * @param o Java heap object in which the value resides, if any, else 1150 * null 1151 * @param offset The offset in bytes from the start of the object 1152 * @return the value fetched from the indicated object 1153 * @throws RuntimeException No defined exceptions are thrown, not even 1154 * {@link NullPointerException} 1155 * @since 9 1156 */ 1157 @HotSpotIntrinsicCandidate 1158 public final long getLongUnaligned(Object o, long offset) { 1159 if ((offset & 7) == 0) { 1160 return getLong(o, offset); 1161 } else if ((offset & 3) == 0) { 1162 return makeLong(getInt(o, offset), 1163 getInt(o, offset + 4)); 1164 } else if ((offset & 1) == 0) { 1165 return makeLong(getShort(o, offset), 1166 getShort(o, offset + 2), 1167 getShort(o, offset + 4), 1168 getShort(o, offset + 6)); 1169 } else { 1170 return makeLong(getByte(o, offset), 1171 getByte(o, offset + 1), 1172 getByte(o, offset + 2), 1173 getByte(o, offset + 3), 1174 getByte(o, offset + 4), 1175 getByte(o, offset + 5), 1176 getByte(o, offset + 6), 1177 getByte(o, offset + 7)); 1178 } 1179 } 1180 /** 1181 * As {@link #getLongUnaligned(Object, long)} but with an 1182 * additional argument which specifies the endianness of the value 1183 * as stored in memory. 1184 * 1185 * @param o Java heap object in which the variable resides 1186 * @param offset The offset in bytes from the start of the object 1187 * @param bigEndian The endianness of the value 1188 * @return the value fetched from the indicated object 1189 * @since 9 1190 */ 1191 public final long getLongUnaligned(Object o, long offset, boolean bigEndian) { 1192 return convEndian(bigEndian, getLongUnaligned(o, offset)); 1193 } 1194 1195 /** @see #getLongUnaligned(Object, long) */ 1196 @HotSpotIntrinsicCandidate 1197 public final int getIntUnaligned(Object o, long offset) { 1198 if ((offset & 3) == 0) { 1199 return getInt(o, offset); 1200 } else if ((offset & 1) == 0) { 1201 return makeInt(getShort(o, offset), 1202 getShort(o, offset + 2)); 1203 } else { 1204 return makeInt(getByte(o, offset), 1205 getByte(o, offset + 1), 1206 getByte(o, offset + 2), 1207 getByte(o, offset + 3)); 1208 } 1209 } 1210 /** @see #getLongUnaligned(Object, long, boolean) */ 1211 public final int getIntUnaligned(Object o, long offset, boolean bigEndian) { 1212 return convEndian(bigEndian, getIntUnaligned(o, offset)); 1213 } 1214 1215 /** @see #getLongUnaligned(Object, long) */ 1216 @HotSpotIntrinsicCandidate 1217 public final short getShortUnaligned(Object o, long offset) { 1218 if ((offset & 1) == 0) { 1219 return getShort(o, offset); 1220 } else { 1221 return makeShort(getByte(o, offset), 1222 getByte(o, offset + 1)); 1223 } 1224 } 1225 /** @see #getLongUnaligned(Object, long, boolean) */ 1226 public final short getShortUnaligned(Object o, long offset, boolean bigEndian) { 1227 return convEndian(bigEndian, getShortUnaligned(o, offset)); 1228 } 1229 1230 /** @see #getLongUnaligned(Object, long) */ 1231 @HotSpotIntrinsicCandidate 1232 public final char getCharUnaligned(Object o, long offset) { 1233 return (char)getShortUnaligned(o, offset); 1234 } 1235 1236 /** @see #getLongUnaligned(Object, long, boolean) */ 1237 public final char getCharUnaligned(Object o, long offset, boolean bigEndian) { 1238 return convEndian(bigEndian, getCharUnaligned(o, offset)); 1239 } 1240 1241 /** 1242 * Stores a value at some byte offset into a given Java object. 1243 * <p> 1244 * The specification of this method is the same as {@link 1245 * #getLong(Object, long)} except that the offset does not need to 1246 * have been obtained from {@link #objectFieldOffset} on the 1247 * {@link java.lang.reflect.Field} of some Java field. The value 1248 * in memory is raw data, and need not correspond to any Java 1249 * variable. The endianness of the value in memory is the 1250 * endianness of the native platform. 1251 * <p> 1252 * The write will be atomic with respect to the largest power of 1253 * two that divides the GCD of the offset and the storage size. 1254 * For example, putLongUnaligned will make atomic writes of 2-, 4-, 1255 * or 8-byte storage units if the offset is zero mod 2, 4, or 8, 1256 * respectively. There are no other guarantees of atomicity. 1257 * <p> 1258 * 8-byte atomicity is only guaranteed on platforms on which 1259 * support atomic accesses to longs. 1260 * 1261 * @param o Java heap object in which the value resides, if any, else 1262 * null 1263 * @param offset The offset in bytes from the start of the object 1264 * @param x the value to store 1265 * @throws RuntimeException No defined exceptions are thrown, not even 1266 * {@link NullPointerException} 1267 * @since 9 1268 */ 1269 @HotSpotIntrinsicCandidate 1270 public final void putLongUnaligned(Object o, long offset, long x) { 1271 if ((offset & 7) == 0) { 1272 putLong(o, offset, x); 1273 } else if ((offset & 3) == 0) { 1274 putLongParts(o, offset, 1275 (int)(x >> 0), 1276 (int)(x >>> 32)); 1277 } else if ((offset & 1) == 0) { 1278 putLongParts(o, offset, 1279 (short)(x >>> 0), 1280 (short)(x >>> 16), 1281 (short)(x >>> 32), 1282 (short)(x >>> 48)); 1283 } else { 1284 putLongParts(o, offset, 1285 (byte)(x >>> 0), 1286 (byte)(x >>> 8), 1287 (byte)(x >>> 16), 1288 (byte)(x >>> 24), 1289 (byte)(x >>> 32), 1290 (byte)(x >>> 40), 1291 (byte)(x >>> 48), 1292 (byte)(x >>> 56)); 1293 } 1294 } 1295 1296 /** 1297 * As {@link #putLongUnaligned(Object, long, long)} but with an additional 1298 * argument which specifies the endianness of the value as stored in memory. 1299 * @param o Java heap object in which the value resides 1300 * @param offset The offset in bytes from the start of the object 1301 * @param x the value to store 1302 * @param bigEndian The endianness of the value 1303 * @throws RuntimeException No defined exceptions are thrown, not even 1304 * {@link NullPointerException} 1305 * @since 9 1306 */ 1307 public final void putLongUnaligned(Object o, long offset, long x, boolean bigEndian) { 1308 putLongUnaligned(o, offset, convEndian(bigEndian, x)); 1309 } 1310 1311 /** @see #putLongUnaligned(Object, long, long) */ 1312 @HotSpotIntrinsicCandidate 1313 public final void putIntUnaligned(Object o, long offset, int x) { 1314 if ((offset & 3) == 0) { 1315 putInt(o, offset, x); 1316 } else if ((offset & 1) == 0) { 1317 putIntParts(o, offset, 1318 (short)(x >> 0), 1319 (short)(x >>> 16)); 1320 } else { 1321 putIntParts(o, offset, 1322 (byte)(x >>> 0), 1323 (byte)(x >>> 8), 1324 (byte)(x >>> 16), 1325 (byte)(x >>> 24)); 1326 } 1327 } 1328 /** @see #putLongUnaligned(Object, long, long, boolean) */ 1329 public final void putIntUnaligned(Object o, long offset, int x, boolean bigEndian) { 1330 putIntUnaligned(o, offset, convEndian(bigEndian, x)); 1331 } 1332 1333 /** @see #putLongUnaligned(Object, long, long) */ 1334 @HotSpotIntrinsicCandidate 1335 public final void putShortUnaligned(Object o, long offset, short x) { 1336 if ((offset & 1) == 0) { 1337 putShort(o, offset, x); 1338 } else { 1339 putShortParts(o, offset, 1340 (byte)(x >>> 0), 1341 (byte)(x >>> 8)); 1342 } 1343 } 1344 /** @see #putLongUnaligned(Object, long, long, boolean) */ 1345 public final void putShortUnaligned(Object o, long offset, short x, boolean bigEndian) { 1346 putShortUnaligned(o, offset, convEndian(bigEndian, x)); 1347 } 1348 1349 /** @see #putLongUnaligned(Object, long, long) */ 1350 @HotSpotIntrinsicCandidate 1351 public final void putCharUnaligned(Object o, long offset, char x) { 1352 putShortUnaligned(o, offset, (short)x); 1353 } 1354 /** @see #putLongUnaligned(Object, long, long, boolean) */ 1355 public final void putCharUnaligned(Object o, long offset, char x, boolean bigEndian) { 1356 putCharUnaligned(o, offset, convEndian(bigEndian, x)); 1357 } 1358 1359 // JVM interface methods 1360 private native boolean unalignedAccess0(); 1361 private native boolean isBigEndian0(); 1362 1363 // BE is true iff the native endianness of this platform is big. 1364 private static final boolean BE = theUnsafe.isBigEndian0(); 1365 1366 // unalignedAccess is true iff this platform can perform unaligned accesses. 1367 private static final boolean unalignedAccess = theUnsafe.unalignedAccess0(); 1368 1369 private static int pickPos(int top, int pos) { return BE ? top - pos : pos; } 1370 1371 // These methods construct integers from bytes. The byte ordering 1372 // is the native endianness of this platform. 1373 private static long makeLong(byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) { 1374 return ((toUnsignedLong(i0) << pickPos(56, 0)) 1375 | (toUnsignedLong(i1) << pickPos(56, 8)) 1376 | (toUnsignedLong(i2) << pickPos(56, 16)) 1377 | (toUnsignedLong(i3) << pickPos(56, 24)) 1378 | (toUnsignedLong(i4) << pickPos(56, 32)) 1379 | (toUnsignedLong(i5) << pickPos(56, 40)) 1380 | (toUnsignedLong(i6) << pickPos(56, 48)) 1381 | (toUnsignedLong(i7) << pickPos(56, 56))); 1382 } 1383 private static long makeLong(short i0, short i1, short i2, short i3) { 1384 return ((toUnsignedLong(i0) << pickPos(48, 0)) 1385 | (toUnsignedLong(i1) << pickPos(48, 16)) 1386 | (toUnsignedLong(i2) << pickPos(48, 32)) 1387 | (toUnsignedLong(i3) << pickPos(48, 48))); 1388 } 1389 private static long makeLong(int i0, int i1) { 1390 return (toUnsignedLong(i0) << pickPos(32, 0)) 1391 | (toUnsignedLong(i1) << pickPos(32, 32)); 1392 } 1393 private static int makeInt(short i0, short i1) { 1394 return (toUnsignedInt(i0) << pickPos(16, 0)) 1395 | (toUnsignedInt(i1) << pickPos(16, 16)); 1396 } 1397 private static int makeInt(byte i0, byte i1, byte i2, byte i3) { 1398 return ((toUnsignedInt(i0) << pickPos(24, 0)) 1399 | (toUnsignedInt(i1) << pickPos(24, 8)) 1400 | (toUnsignedInt(i2) << pickPos(24, 16)) 1401 | (toUnsignedInt(i3) << pickPos(24, 24))); 1402 } 1403 private static short makeShort(byte i0, byte i1) { 1404 return (short)((toUnsignedInt(i0) << pickPos(8, 0)) 1405 | (toUnsignedInt(i1) << pickPos(8, 8))); 1406 } 1407 1408 private static byte pick(byte le, byte be) { return BE ? be : le; } 1409 private static short pick(short le, short be) { return BE ? be : le; } 1410 private static int pick(int le, int be) { return BE ? be : le; } 1411 1412 // These methods write integers to memory from smaller parts 1413 // provided by their caller. The ordering in which these parts 1414 // are written is the native endianness of this platform. 1415 private void putLongParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) { 1416 putByte(o, offset + 0, pick(i0, i7)); 1417 putByte(o, offset + 1, pick(i1, i6)); 1418 putByte(o, offset + 2, pick(i2, i5)); 1419 putByte(o, offset + 3, pick(i3, i4)); 1420 putByte(o, offset + 4, pick(i4, i3)); 1421 putByte(o, offset + 5, pick(i5, i2)); 1422 putByte(o, offset + 6, pick(i6, i1)); 1423 putByte(o, offset + 7, pick(i7, i0)); 1424 } 1425 private void putLongParts(Object o, long offset, short i0, short i1, short i2, short i3) { 1426 putShort(o, offset + 0, pick(i0, i3)); 1427 putShort(o, offset + 2, pick(i1, i2)); 1428 putShort(o, offset + 4, pick(i2, i1)); 1429 putShort(o, offset + 6, pick(i3, i0)); 1430 } 1431 private void putLongParts(Object o, long offset, int i0, int i1) { 1432 putInt(o, offset + 0, pick(i0, i1)); 1433 putInt(o, offset + 4, pick(i1, i0)); 1434 } 1435 private void putIntParts(Object o, long offset, short i0, short i1) { 1436 putShort(o, offset + 0, pick(i0, i1)); 1437 putShort(o, offset + 2, pick(i1, i0)); 1438 } 1439 private void putIntParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3) { 1440 putByte(o, offset + 0, pick(i0, i3)); 1441 putByte(o, offset + 1, pick(i1, i2)); 1442 putByte(o, offset + 2, pick(i2, i1)); 1443 putByte(o, offset + 3, pick(i3, i0)); 1444 } 1445 private void putShortParts(Object o, long offset, byte i0, byte i1) { 1446 putByte(o, offset + 0, pick(i0, i1)); 1447 putByte(o, offset + 1, pick(i1, i0)); 1448 } 1449 1450 // Zero-extend an integer 1451 private static int toUnsignedInt(byte n) { return n & 0xff; } 1452 private static int toUnsignedInt(short n) { return n & 0xffff; } 1453 private static long toUnsignedLong(byte n) { return n & 0xffl; } 1454 private static long toUnsignedLong(short n) { return n & 0xffffl; } 1455 private static long toUnsignedLong(int n) { return n & 0xffffffffl; } 1456 1457 // Maybe byte-reverse an integer 1458 private static char convEndian(boolean big, char n) { return big == BE ? n : Character.reverseBytes(n); } 1459 private static short convEndian(boolean big, short n) { return big == BE ? n : Short.reverseBytes(n) ; } 1460 private static int convEndian(boolean big, int n) { return big == BE ? n : Integer.reverseBytes(n) ; } 1461 private static long convEndian(boolean big, long n) { return big == BE ? n : Long.reverseBytes(n) ; } 1462 }