1 /* 2 * Copyright (c) 2015, 2020, 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. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 8154556 27 * @run testng/othervm/timeout=360 -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsLong 28 * @run testng/othervm/timeout=360 -Diters=20000 VarHandleTestByteArrayAsLong 29 * @run testng/othervm/timeout=360 -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAsLong 30 */ 31 32 import org.testng.annotations.DataProvider; 33 import org.testng.annotations.Test; 34 35 import java.lang.invoke.MethodHandles; 36 import java.lang.invoke.VarHandle; 37 import java.nio.ByteBuffer; 38 import java.nio.ByteOrder; 39 import java.util.ArrayList; 40 import java.util.Arrays; 41 import java.util.EnumSet; 42 import java.util.List; 43 44 import static org.testng.Assert.*; 45 46 public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest { 47 static final int SIZE = Long.BYTES; 48 49 static final long VALUE_1 = 0x0102030405060708L; 50 51 static final long VALUE_2 = 0x1112131415161718L; 52 53 static final long VALUE_3 = 0xFFFEFDFCFBFAF9F8L; 54 55 56 @Override setupVarHandleSources(boolean same)57 public List<VarHandleSource> setupVarHandleSources(boolean same) { 58 // Combinations of VarHandle byte[] or ByteBuffer 59 List<VarHandleSource> vhss = new ArrayList<>(); 60 for (MemoryMode endianess : List.of(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { 61 62 ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN 63 ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; 64 65 Class<?> arrayType; 66 if (same) { 67 arrayType = long[].class; 68 } 69 else { 70 arrayType = int[].class; 71 } 72 VarHandleSource aeh = new VarHandleSource( 73 MethodHandles.byteArrayViewVarHandle(arrayType, bo), 74 endianess, MemoryMode.READ_WRITE); 75 vhss.add(aeh); 76 77 VarHandleSource bbh = new VarHandleSource( 78 MethodHandles.byteBufferViewVarHandle(arrayType, bo), 79 endianess, MemoryMode.READ_WRITE); 80 vhss.add(bbh); 81 } 82 return vhss; 83 } 84 85 @Test testEquals()86 public void testEquals() { 87 VarHandle[] vhs1 = setupVarHandleSources(true).stream(). 88 map(vhs -> vhs.s).toArray(VarHandle[]::new); 89 VarHandle[] vhs2 = setupVarHandleSources(true).stream(). 90 map(vhs -> vhs.s).toArray(VarHandle[]::new); 91 92 for (int i = 0; i < vhs1.length; i++) { 93 for (int j = 0; j < vhs1.length; j++) { 94 if (i != j) { 95 assertNotEquals(vhs1[i], vhs1[j]); 96 assertNotEquals(vhs1[i], vhs2[j]); 97 } 98 } 99 } 100 101 VarHandle[] vhs3 = setupVarHandleSources(false).stream(). 102 map(vhs -> vhs.s).toArray(VarHandle[]::new); 103 for (int i = 0; i < vhs1.length; i++) { 104 assertNotEquals(vhs1[i], vhs3[i]); 105 } 106 } 107 108 @Test(dataProvider = "varHandlesProvider") testIsAccessModeSupported(VarHandleSource vhs)109 public void testIsAccessModeSupported(VarHandleSource vhs) { 110 VarHandle vh = vhs.s; 111 112 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); 113 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET)); 114 115 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE)); 116 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE)); 117 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE)); 118 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE)); 119 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE)); 120 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE)); 121 122 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET)); 123 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE)); 124 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); 125 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); 126 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN)); 127 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); 128 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); 129 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); 130 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); 131 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE)); 132 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE)); 133 134 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); 135 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE)); 136 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE)); 137 138 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR)); 139 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)); 140 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)); 141 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND)); 142 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)); 143 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)); 144 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR)); 145 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)); 146 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE)); 147 } 148 149 @Test(dataProvider = "typesProvider") testTypes(VarHandle vh, List<java.lang.Class<?>> pts)150 public void testTypes(VarHandle vh, List<java.lang.Class<?>> pts) { 151 assertEquals(vh.varType(), long.class); 152 153 assertEquals(vh.coordinateTypes(), pts); 154 155 testTypes(vh); 156 } 157 158 159 @DataProvider accessTestCaseProvider()160 public Object[][] accessTestCaseProvider() throws Exception { 161 List<AccessTestCase<?>> cases = new ArrayList<>(); 162 163 for (ByteArrayViewSource<?> bav : bavss) { 164 for (VarHandleSource vh : vhss) { 165 if (vh.matches(bav)) { 166 if (bav instanceof ByteArraySource) { 167 ByteArraySource bas = (ByteArraySource) bav; 168 169 cases.add(new VarHandleSourceAccessTestCase( 170 "read write", bav, vh, h -> testArrayReadWrite(bas, h), 171 true)); 172 cases.add(new VarHandleSourceAccessTestCase( 173 "null array", bav, vh, h -> testArrayNPE(bas, h), 174 false)); 175 cases.add(new VarHandleSourceAccessTestCase( 176 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h), 177 false)); 178 cases.add(new VarHandleSourceAccessTestCase( 179 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bas, h), 180 false)); 181 cases.add(new VarHandleSourceAccessTestCase( 182 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bas, h), 183 false)); 184 } 185 else { 186 ByteBufferSource bbs = (ByteBufferSource) bav; 187 188 if (MemoryMode.READ_WRITE.isSet(bav.memoryModes)) { 189 cases.add(new VarHandleSourceAccessTestCase( 190 "read write", bav, vh, h -> testArrayReadWrite(bbs, h), 191 true)); 192 } 193 else { 194 cases.add(new VarHandleSourceAccessTestCase( 195 "read only", bav, vh, h -> testArrayReadOnly(bbs, h), 196 true)); 197 } 198 199 cases.add(new VarHandleSourceAccessTestCase( 200 "null buffer", bav, vh, h -> testArrayNPE(bbs, h), 201 false)); 202 cases.add(new VarHandleSourceAccessTestCase( 203 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h), 204 false)); 205 cases.add(new VarHandleSourceAccessTestCase( 206 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bbs, h), 207 false)); 208 cases.add(new VarHandleSourceAccessTestCase( 209 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bbs, h), 210 false)); 211 } 212 } 213 } 214 } 215 216 // Work around issue with jtreg summary reporting which truncates 217 // the String result of Object.toString to 30 characters, hence 218 // the first dummy argument 219 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new); 220 } 221 222 @Test(dataProvider = "accessTestCaseProvider") testAccess(String desc, AccessTestCase<T> atc)223 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 224 T t = atc.get(); 225 int iters = atc.requiresLoop() ? ITERS : 1; 226 for (int c = 0; c < iters; c++) { 227 atc.testAccess(t); 228 } 229 } 230 231 testArrayNPE(ByteArraySource bs, VarHandleSource vhs)232 static void testArrayNPE(ByteArraySource bs, VarHandleSource vhs) { 233 VarHandle vh = vhs.s; 234 byte[] array = null; 235 int ci = 1; 236 237 checkNPE(() -> { 238 long x = (long) vh.get(array, ci); 239 }); 240 241 checkNPE(() -> { 242 vh.set(array, ci, VALUE_1); 243 }); 244 245 checkNPE(() -> { 246 long x = (long) vh.getVolatile(array, ci); 247 }); 248 249 checkNPE(() -> { 250 long x = (long) vh.getAcquire(array, ci); 251 }); 252 253 checkNPE(() -> { 254 long x = (long) vh.getOpaque(array, ci); 255 }); 256 257 checkNPE(() -> { 258 vh.setVolatile(array, ci, VALUE_1); 259 }); 260 261 checkNPE(() -> { 262 vh.setRelease(array, ci, VALUE_1); 263 }); 264 265 checkNPE(() -> { 266 vh.setOpaque(array, ci, VALUE_1); 267 }); 268 269 checkNPE(() -> { 270 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); 271 }); 272 273 checkNPE(() -> { 274 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1); 275 }); 276 277 checkNPE(() -> { 278 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1); 279 }); 280 281 checkNPE(() -> { 282 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1); 283 }); 284 285 checkNPE(() -> { 286 boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2); 287 }); 288 289 checkNPE(() -> { 290 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2); 291 }); 292 293 checkNPE(() -> { 294 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2); 295 }); 296 297 checkNPE(() -> { 298 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2); 299 }); 300 301 checkNPE(() -> { 302 long o = (long) vh.getAndSet(array, ci, VALUE_1); 303 }); 304 305 checkNPE(() -> { 306 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1); 307 }); 308 309 checkNPE(() -> { 310 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1); 311 }); 312 313 checkNPE(() -> { 314 long o = (long) vh.getAndAdd(array, ci, VALUE_1); 315 }); 316 317 checkNPE(() -> { 318 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1); 319 }); 320 321 checkNPE(() -> { 322 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1); 323 }); 324 325 checkNPE(() -> { 326 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1); 327 }); 328 329 checkNPE(() -> { 330 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1); 331 }); 332 333 checkNPE(() -> { 334 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1); 335 }); 336 337 checkNPE(() -> { 338 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1); 339 }); 340 341 checkNPE(() -> { 342 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1); 343 }); 344 345 checkNPE(() -> { 346 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1); 347 }); 348 349 checkNPE(() -> { 350 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1); 351 }); 352 353 checkNPE(() -> { 354 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1); 355 }); 356 357 checkNPE(() -> { 358 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1); 359 }); 360 } 361 testArrayNPE(ByteBufferSource bs, VarHandleSource vhs)362 static void testArrayNPE(ByteBufferSource bs, VarHandleSource vhs) { 363 VarHandle vh = vhs.s; 364 ByteBuffer array = null; 365 int ci = 1; 366 367 checkNPE(() -> { 368 long x = (long) vh.get(array, ci); 369 }); 370 371 checkNPE(() -> { 372 vh.set(array, ci, VALUE_1); 373 }); 374 375 checkNPE(() -> { 376 long x = (long) vh.getVolatile(array, ci); 377 }); 378 379 checkNPE(() -> { 380 long x = (long) vh.getAcquire(array, ci); 381 }); 382 383 checkNPE(() -> { 384 long x = (long) vh.getOpaque(array, ci); 385 }); 386 387 checkNPE(() -> { 388 vh.setVolatile(array, ci, VALUE_1); 389 }); 390 391 checkNPE(() -> { 392 vh.setRelease(array, ci, VALUE_1); 393 }); 394 395 checkNPE(() -> { 396 vh.setOpaque(array, ci, VALUE_1); 397 }); 398 399 checkNPE(() -> { 400 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); 401 }); 402 403 checkNPE(() -> { 404 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1); 405 }); 406 407 checkNPE(() -> { 408 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1); 409 }); 410 411 checkNPE(() -> { 412 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1); 413 }); 414 415 checkNPE(() -> { 416 boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2); 417 }); 418 419 checkNPE(() -> { 420 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2); 421 }); 422 423 checkNPE(() -> { 424 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2); 425 }); 426 427 checkNPE(() -> { 428 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2); 429 }); 430 431 checkNPE(() -> { 432 long o = (long) vh.getAndSet(array, ci, VALUE_1); 433 }); 434 435 checkNPE(() -> { 436 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1); 437 }); 438 439 checkNPE(() -> { 440 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1); 441 }); 442 443 checkNPE(() -> { 444 long o = (long) vh.getAndAdd(array, ci, VALUE_1); 445 }); 446 447 checkNPE(() -> { 448 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1); 449 }); 450 451 checkNPE(() -> { 452 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1); 453 }); 454 455 checkNPE(() -> { 456 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1); 457 }); 458 459 checkNPE(() -> { 460 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1); 461 }); 462 463 checkNPE(() -> { 464 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1); 465 }); 466 467 checkNPE(() -> { 468 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1); 469 }); 470 471 checkNPE(() -> { 472 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1); 473 }); 474 475 checkNPE(() -> { 476 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1); 477 }); 478 479 checkNPE(() -> { 480 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1); 481 }); 482 483 checkNPE(() -> { 484 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1); 485 }); 486 487 checkNPE(() -> { 488 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1); 489 }); 490 } 491 testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs)492 static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) { 493 VarHandle vh = vhs.s; 494 byte[] array = bs.s; 495 int ci = 1; 496 497 498 499 } 500 testArrayUnsupported(ByteBufferSource bs, VarHandleSource vhs)501 static void testArrayUnsupported(ByteBufferSource bs, VarHandleSource vhs) { 502 VarHandle vh = vhs.s; 503 ByteBuffer array = bs.s; 504 int ci = 0; 505 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes); 506 507 if (readOnly) { 508 checkROBE(() -> { 509 vh.set(array, ci, VALUE_1); 510 }); 511 } 512 513 if (readOnly) { 514 checkROBE(() -> { 515 vh.setVolatile(array, ci, VALUE_1); 516 }); 517 518 checkROBE(() -> { 519 vh.setRelease(array, ci, VALUE_1); 520 }); 521 522 checkROBE(() -> { 523 vh.setOpaque(array, ci, VALUE_1); 524 }); 525 526 checkROBE(() -> { 527 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); 528 }); 529 530 checkROBE(() -> { 531 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1); 532 }); 533 534 checkROBE(() -> { 535 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1); 536 }); 537 538 checkROBE(() -> { 539 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1); 540 }); 541 542 checkROBE(() -> { 543 boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2); 544 }); 545 546 checkROBE(() -> { 547 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2); 548 }); 549 550 checkROBE(() -> { 551 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2); 552 }); 553 554 checkROBE(() -> { 555 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2); 556 }); 557 558 checkROBE(() -> { 559 long o = (long) vh.getAndSet(array, ci, VALUE_1); 560 }); 561 562 checkROBE(() -> { 563 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1); 564 }); 565 566 checkROBE(() -> { 567 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1); 568 }); 569 570 571 checkROBE(() -> { 572 long o = (long) vh.getAndAdd(array, ci, VALUE_1); 573 }); 574 575 checkROBE(() -> { 576 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1); 577 }); 578 579 checkROBE(() -> { 580 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1); 581 }); 582 583 checkROBE(() -> { 584 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1); 585 }); 586 587 checkROBE(() -> { 588 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1); 589 }); 590 591 checkROBE(() -> { 592 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1); 593 }); 594 595 checkROBE(() -> { 596 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1); 597 }); 598 599 checkROBE(() -> { 600 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1); 601 }); 602 603 checkROBE(() -> { 604 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1); 605 }); 606 607 checkROBE(() -> { 608 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1); 609 }); 610 611 checkROBE(() -> { 612 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1); 613 }); 614 615 checkROBE(() -> { 616 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1); 617 }); 618 } 619 else { 620 } 621 } 622 623 testArrayIndexOutOfBounds(ByteArraySource bs, VarHandleSource vhs)624 static void testArrayIndexOutOfBounds(ByteArraySource bs, VarHandleSource vhs) throws Throwable { 625 VarHandle vh = vhs.s; 626 byte[] array = bs.s; 627 628 int length = array.length - SIZE + 1; 629 for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) { 630 final int ci = i; 631 632 checkIOOBE(() -> { 633 long x = (long) vh.get(array, ci); 634 }); 635 636 checkIOOBE(() -> { 637 vh.set(array, ci, VALUE_1); 638 }); 639 640 checkIOOBE(() -> { 641 long x = (long) vh.getVolatile(array, ci); 642 }); 643 644 checkIOOBE(() -> { 645 long x = (long) vh.getAcquire(array, ci); 646 }); 647 648 checkIOOBE(() -> { 649 long x = (long) vh.getOpaque(array, ci); 650 }); 651 652 checkIOOBE(() -> { 653 vh.setVolatile(array, ci, VALUE_1); 654 }); 655 656 checkIOOBE(() -> { 657 vh.setRelease(array, ci, VALUE_1); 658 }); 659 660 checkIOOBE(() -> { 661 vh.setOpaque(array, ci, VALUE_1); 662 }); 663 664 checkIOOBE(() -> { 665 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); 666 }); 667 668 checkIOOBE(() -> { 669 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1); 670 }); 671 672 checkIOOBE(() -> { 673 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1); 674 }); 675 676 checkIOOBE(() -> { 677 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1); 678 }); 679 680 checkIOOBE(() -> { 681 boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2); 682 }); 683 684 checkIOOBE(() -> { 685 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2); 686 }); 687 688 checkIOOBE(() -> { 689 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2); 690 }); 691 692 checkIOOBE(() -> { 693 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2); 694 }); 695 696 checkIOOBE(() -> { 697 long o = (long) vh.getAndSet(array, ci, VALUE_1); 698 }); 699 700 checkIOOBE(() -> { 701 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1); 702 }); 703 704 checkIOOBE(() -> { 705 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1); 706 }); 707 708 checkIOOBE(() -> { 709 long o = (long) vh.getAndAdd(array, ci, VALUE_1); 710 }); 711 712 checkIOOBE(() -> { 713 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1); 714 }); 715 716 checkIOOBE(() -> { 717 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1); 718 }); 719 720 checkIOOBE(() -> { 721 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1); 722 }); 723 724 checkIOOBE(() -> { 725 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1); 726 }); 727 728 checkIOOBE(() -> { 729 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1); 730 }); 731 732 checkIOOBE(() -> { 733 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1); 734 }); 735 736 checkIOOBE(() -> { 737 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1); 738 }); 739 740 checkIOOBE(() -> { 741 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1); 742 }); 743 744 checkIOOBE(() -> { 745 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1); 746 }); 747 748 checkIOOBE(() -> { 749 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1); 750 }); 751 752 checkIOOBE(() -> { 753 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1); 754 }); 755 756 } 757 } 758 testArrayIndexOutOfBounds(ByteBufferSource bs, VarHandleSource vhs)759 static void testArrayIndexOutOfBounds(ByteBufferSource bs, VarHandleSource vhs) throws Throwable { 760 VarHandle vh = vhs.s; 761 ByteBuffer array = bs.s; 762 763 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes); 764 765 int length = array.limit() - SIZE + 1; 766 for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) { 767 final int ci = i; 768 769 checkIOOBE(() -> { 770 long x = (long) vh.get(array, ci); 771 }); 772 773 if (!readOnly) { 774 checkIOOBE(() -> { 775 vh.set(array, ci, VALUE_1); 776 }); 777 } 778 779 checkIOOBE(() -> { 780 long x = (long) vh.getVolatile(array, ci); 781 }); 782 783 checkIOOBE(() -> { 784 long x = (long) vh.getAcquire(array, ci); 785 }); 786 787 checkIOOBE(() -> { 788 long x = (long) vh.getOpaque(array, ci); 789 }); 790 791 if (!readOnly) { 792 checkIOOBE(() -> { 793 vh.setVolatile(array, ci, VALUE_1); 794 }); 795 796 checkIOOBE(() -> { 797 vh.setRelease(array, ci, VALUE_1); 798 }); 799 800 checkIOOBE(() -> { 801 vh.setOpaque(array, ci, VALUE_1); 802 }); 803 804 checkIOOBE(() -> { 805 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); 806 }); 807 808 checkIOOBE(() -> { 809 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1); 810 }); 811 812 checkIOOBE(() -> { 813 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1); 814 }); 815 816 checkIOOBE(() -> { 817 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1); 818 }); 819 820 checkIOOBE(() -> { 821 boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2); 822 }); 823 824 checkIOOBE(() -> { 825 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2); 826 }); 827 828 checkIOOBE(() -> { 829 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2); 830 }); 831 832 checkIOOBE(() -> { 833 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2); 834 }); 835 836 checkIOOBE(() -> { 837 long o = (long) vh.getAndSet(array, ci, VALUE_1); 838 }); 839 840 checkIOOBE(() -> { 841 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1); 842 }); 843 844 checkIOOBE(() -> { 845 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1); 846 }); 847 848 checkIOOBE(() -> { 849 long o = (long) vh.getAndAdd(array, ci, VALUE_1); 850 }); 851 852 checkIOOBE(() -> { 853 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1); 854 }); 855 856 checkIOOBE(() -> { 857 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1); 858 }); 859 860 checkIOOBE(() -> { 861 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1); 862 }); 863 864 checkIOOBE(() -> { 865 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1); 866 }); 867 868 checkIOOBE(() -> { 869 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1); 870 }); 871 872 checkIOOBE(() -> { 873 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1); 874 }); 875 876 checkIOOBE(() -> { 877 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1); 878 }); 879 880 checkIOOBE(() -> { 881 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1); 882 }); 883 884 checkIOOBE(() -> { 885 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1); 886 }); 887 888 checkIOOBE(() -> { 889 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1); 890 }); 891 892 checkIOOBE(() -> { 893 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1); 894 }); 895 } 896 } 897 } 898 testArrayMisalignedAccess(ByteArraySource bs, VarHandleSource vhs)899 static void testArrayMisalignedAccess(ByteArraySource bs, VarHandleSource vhs) throws Throwable { 900 VarHandle vh = vhs.s; 901 byte[] array = bs.s; 902 903 int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE); 904 905 int length = array.length - SIZE + 1; 906 for (int i = 0; i < length; i++) { 907 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0; 908 final int ci = i; 909 910 if (!iAligned) { 911 checkISE(() -> { 912 long x = (long) vh.getVolatile(array, ci); 913 }); 914 915 checkISE(() -> { 916 long x = (long) vh.getAcquire(array, ci); 917 }); 918 919 checkISE(() -> { 920 long x = (long) vh.getOpaque(array, ci); 921 }); 922 923 checkISE(() -> { 924 vh.setVolatile(array, ci, VALUE_1); 925 }); 926 927 checkISE(() -> { 928 vh.setRelease(array, ci, VALUE_1); 929 }); 930 931 checkISE(() -> { 932 vh.setOpaque(array, ci, VALUE_1); 933 }); 934 935 checkISE(() -> { 936 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); 937 }); 938 939 checkISE(() -> { 940 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1); 941 }); 942 943 checkISE(() -> { 944 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1); 945 }); 946 947 checkISE(() -> { 948 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1); 949 }); 950 951 checkISE(() -> { 952 boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2); 953 }); 954 955 checkISE(() -> { 956 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2); 957 }); 958 959 checkISE(() -> { 960 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2); 961 }); 962 963 checkISE(() -> { 964 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2); 965 }); 966 967 checkISE(() -> { 968 long o = (long) vh.getAndSet(array, ci, VALUE_1); 969 }); 970 971 checkISE(() -> { 972 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1); 973 }); 974 975 checkISE(() -> { 976 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1); 977 }); 978 979 checkISE(() -> { 980 long o = (long) vh.getAndAdd(array, ci, VALUE_1); 981 }); 982 983 checkISE(() -> { 984 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1); 985 }); 986 987 checkISE(() -> { 988 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1); 989 }); 990 991 checkISE(() -> { 992 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1); 993 }); 994 995 checkISE(() -> { 996 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1); 997 }); 998 999 checkISE(() -> { 1000 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1); 1001 }); 1002 1003 checkISE(() -> { 1004 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1); 1005 }); 1006 1007 checkISE(() -> { 1008 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1); 1009 }); 1010 1011 checkISE(() -> { 1012 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1); 1013 }); 1014 1015 checkISE(() -> { 1016 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1); 1017 }); 1018 1019 checkISE(() -> { 1020 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1); 1021 }); 1022 1023 checkISE(() -> { 1024 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1); 1025 }); 1026 } 1027 } 1028 } 1029 testArrayMisalignedAccess(ByteBufferSource bs, VarHandleSource vhs)1030 static void testArrayMisalignedAccess(ByteBufferSource bs, VarHandleSource vhs) throws Throwable { 1031 VarHandle vh = vhs.s; 1032 ByteBuffer array = bs.s; 1033 1034 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes); 1035 int misalignmentAtZero = array.alignmentOffset(0, SIZE); 1036 1037 int length = array.limit() - SIZE + 1; 1038 for (int i = 0; i < length; i++) { 1039 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0; 1040 final int ci = i; 1041 1042 if (!iAligned) { 1043 checkISE(() -> { 1044 long x = (long) vh.getVolatile(array, ci); 1045 }); 1046 1047 checkISE(() -> { 1048 long x = (long) vh.getAcquire(array, ci); 1049 }); 1050 1051 checkISE(() -> { 1052 long x = (long) vh.getOpaque(array, ci); 1053 }); 1054 1055 if (!readOnly) { 1056 checkISE(() -> { 1057 vh.setVolatile(array, ci, VALUE_1); 1058 }); 1059 1060 checkISE(() -> { 1061 vh.setRelease(array, ci, VALUE_1); 1062 }); 1063 1064 checkISE(() -> { 1065 vh.setOpaque(array, ci, VALUE_1); 1066 }); 1067 1068 checkISE(() -> { 1069 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); 1070 }); 1071 1072 checkISE(() -> { 1073 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1); 1074 }); 1075 1076 checkISE(() -> { 1077 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1); 1078 }); 1079 1080 checkISE(() -> { 1081 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1); 1082 }); 1083 1084 checkISE(() -> { 1085 boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2); 1086 }); 1087 1088 checkISE(() -> { 1089 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2); 1090 }); 1091 1092 checkISE(() -> { 1093 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2); 1094 }); 1095 1096 checkISE(() -> { 1097 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2); 1098 }); 1099 1100 checkISE(() -> { 1101 long o = (long) vh.getAndSet(array, ci, VALUE_1); 1102 }); 1103 1104 checkISE(() -> { 1105 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1); 1106 }); 1107 1108 checkISE(() -> { 1109 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1); 1110 }); 1111 1112 checkISE(() -> { 1113 long o = (long) vh.getAndAdd(array, ci, VALUE_1); 1114 }); 1115 1116 checkISE(() -> { 1117 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1); 1118 }); 1119 1120 checkISE(() -> { 1121 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1); 1122 }); 1123 1124 checkISE(() -> { 1125 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1); 1126 }); 1127 1128 checkISE(() -> { 1129 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1); 1130 }); 1131 1132 checkISE(() -> { 1133 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1); 1134 }); 1135 1136 checkISE(() -> { 1137 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1); 1138 }); 1139 1140 checkISE(() -> { 1141 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1); 1142 }); 1143 1144 checkISE(() -> { 1145 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1); 1146 }); 1147 1148 checkISE(() -> { 1149 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1); 1150 }); 1151 1152 checkISE(() -> { 1153 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1); 1154 }); 1155 1156 checkISE(() -> { 1157 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1); 1158 }); 1159 } 1160 } 1161 } 1162 } 1163 testArrayReadWrite(ByteArraySource bs, VarHandleSource vhs)1164 static void testArrayReadWrite(ByteArraySource bs, VarHandleSource vhs) { 1165 VarHandle vh = vhs.s; 1166 byte[] array = bs.s; 1167 1168 int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE); 1169 1170 bs.fill((byte) 0xff); 1171 int length = array.length - SIZE + 1; 1172 for (int i = 0; i < length; i++) { 1173 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0; 1174 1175 // Plain 1176 { 1177 vh.set(array, i, VALUE_1); 1178 long x = (long) vh.get(array, i); 1179 assertEquals(x, VALUE_1, "get long value"); 1180 } 1181 1182 1183 if (iAligned) { 1184 // Volatile 1185 { 1186 vh.setVolatile(array, i, VALUE_2); 1187 long x = (long) vh.getVolatile(array, i); 1188 assertEquals(x, VALUE_2, "setVolatile long value"); 1189 } 1190 1191 // Lazy 1192 { 1193 vh.setRelease(array, i, VALUE_1); 1194 long x = (long) vh.getAcquire(array, i); 1195 assertEquals(x, VALUE_1, "setRelease long value"); 1196 } 1197 1198 // Opaque 1199 { 1200 vh.setOpaque(array, i, VALUE_2); 1201 long x = (long) vh.getOpaque(array, i); 1202 assertEquals(x, VALUE_2, "setOpaque long value"); 1203 } 1204 1205 vh.set(array, i, VALUE_1); 1206 1207 // Compare 1208 { 1209 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2); 1210 assertEquals(r, true, "success compareAndSet long"); 1211 long x = (long) vh.get(array, i); 1212 assertEquals(x, VALUE_2, "success compareAndSet long value"); 1213 } 1214 1215 { 1216 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3); 1217 assertEquals(r, false, "failing compareAndSet long"); 1218 long x = (long) vh.get(array, i); 1219 assertEquals(x, VALUE_2, "failing compareAndSet long value"); 1220 } 1221 1222 { 1223 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_1); 1224 assertEquals(r, VALUE_2, "success compareAndExchange long"); 1225 long x = (long) vh.get(array, i); 1226 assertEquals(x, VALUE_1, "success compareAndExchange long value"); 1227 } 1228 1229 { 1230 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_3); 1231 assertEquals(r, VALUE_1, "failing compareAndExchange long"); 1232 long x = (long) vh.get(array, i); 1233 assertEquals(x, VALUE_1, "failing compareAndExchange long value"); 1234 } 1235 1236 { 1237 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2); 1238 assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long"); 1239 long x = (long) vh.get(array, i); 1240 assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value"); 1241 } 1242 1243 { 1244 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3); 1245 assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long"); 1246 long x = (long) vh.get(array, i); 1247 assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value"); 1248 } 1249 1250 { 1251 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1); 1252 assertEquals(r, VALUE_2, "success compareAndExchangeRelease long"); 1253 long x = (long) vh.get(array, i); 1254 assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value"); 1255 } 1256 1257 { 1258 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3); 1259 assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long"); 1260 long x = (long) vh.get(array, i); 1261 assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value"); 1262 } 1263 1264 { 1265 boolean success = false; 1266 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1267 success = vh.weakCompareAndSetPlain(array, i, VALUE_1, VALUE_2); 1268 } 1269 assertEquals(success, true, "weakCompareAndSetPlain long"); 1270 long x = (long) vh.get(array, i); 1271 assertEquals(x, VALUE_2, "weakCompareAndSetPlain long value"); 1272 } 1273 1274 { 1275 boolean success = false; 1276 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1277 success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1); 1278 } 1279 assertEquals(success, true, "weakCompareAndSetAcquire long"); 1280 long x = (long) vh.get(array, i); 1281 assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long"); 1282 } 1283 1284 { 1285 boolean success = false; 1286 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1287 success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2); 1288 } 1289 assertEquals(success, true, "weakCompareAndSetRelease long"); 1290 long x = (long) vh.get(array, i); 1291 assertEquals(x, VALUE_2, "weakCompareAndSetRelease long"); 1292 } 1293 1294 { 1295 boolean success = false; 1296 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1297 success = vh.weakCompareAndSet(array, i, VALUE_2, VALUE_1); 1298 } 1299 assertEquals(success, true, "weakCompareAndSet long"); 1300 long x = (long) vh.get(array, i); 1301 assertEquals(x, VALUE_1, "weakCompareAndSet long"); 1302 } 1303 1304 // Compare set and get 1305 { 1306 vh.set(array, i, VALUE_1); 1307 1308 long o = (long) vh.getAndSet(array, i, VALUE_2); 1309 assertEquals(o, VALUE_1, "getAndSet long"); 1310 long x = (long) vh.get(array, i); 1311 assertEquals(x, VALUE_2, "getAndSet long value"); 1312 } 1313 1314 { 1315 vh.set(array, i, VALUE_1); 1316 1317 long o = (long) vh.getAndSetAcquire(array, i, VALUE_2); 1318 assertEquals(o, VALUE_1, "getAndSetAcquire long"); 1319 long x = (long) vh.get(array, i); 1320 assertEquals(x, VALUE_2, "getAndSetAcquire long value"); 1321 } 1322 1323 { 1324 vh.set(array, i, VALUE_1); 1325 1326 long o = (long) vh.getAndSetRelease(array, i, VALUE_2); 1327 assertEquals(o, VALUE_1, "getAndSetRelease long"); 1328 long x = (long) vh.get(array, i); 1329 assertEquals(x, VALUE_2, "getAndSetRelease long value"); 1330 } 1331 1332 // get and add, add and get 1333 { 1334 vh.set(array, i, VALUE_1); 1335 1336 long o = (long) vh.getAndAdd(array, i, VALUE_2); 1337 assertEquals(o, VALUE_1, "getAndAdd long"); 1338 long x = (long) vh.get(array, i); 1339 assertEquals(x, VALUE_1 + VALUE_2, "getAndAdd long value"); 1340 } 1341 1342 { 1343 vh.set(array, i, VALUE_1); 1344 1345 long o = (long) vh.getAndAddAcquire(array, i, VALUE_2); 1346 assertEquals(o, VALUE_1, "getAndAddAcquire long"); 1347 long x = (long) vh.get(array, i); 1348 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddAcquire long value"); 1349 } 1350 1351 { 1352 vh.set(array, i, VALUE_1); 1353 1354 long o = (long) vh.getAndAddRelease(array, i, VALUE_2); 1355 assertEquals(o, VALUE_1, "getAndAddRelease long"); 1356 long x = (long) vh.get(array, i); 1357 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddRelease long value"); 1358 } 1359 1360 // get and bitwise or 1361 { 1362 vh.set(array, i, VALUE_1); 1363 1364 long o = (long) vh.getAndBitwiseOr(array, i, VALUE_2); 1365 assertEquals(o, VALUE_1, "getAndBitwiseOr long"); 1366 long x = (long) vh.get(array, i); 1367 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOr long value"); 1368 } 1369 1370 { 1371 vh.set(array, i, VALUE_1); 1372 1373 long o = (long) vh.getAndBitwiseOrAcquire(array, i, VALUE_2); 1374 assertEquals(o, VALUE_1, "getAndBitwiseOrAcquire long"); 1375 long x = (long) vh.get(array, i); 1376 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrAcquire long value"); 1377 } 1378 1379 { 1380 vh.set(array, i, VALUE_1); 1381 1382 long o = (long) vh.getAndBitwiseOrRelease(array, i, VALUE_2); 1383 assertEquals(o, VALUE_1, "getAndBitwiseOrRelease long"); 1384 long x = (long) vh.get(array, i); 1385 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrRelease long value"); 1386 } 1387 1388 // get and bitwise and 1389 { 1390 vh.set(array, i, VALUE_1); 1391 1392 long o = (long) vh.getAndBitwiseAnd(array, i, VALUE_2); 1393 assertEquals(o, VALUE_1, "getAndBitwiseAnd long"); 1394 long x = (long) vh.get(array, i); 1395 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAnd long value"); 1396 } 1397 1398 { 1399 vh.set(array, i, VALUE_1); 1400 1401 long o = (long) vh.getAndBitwiseAndAcquire(array, i, VALUE_2); 1402 assertEquals(o, VALUE_1, "getAndBitwiseAndAcquire long"); 1403 long x = (long) vh.get(array, i); 1404 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndAcquire long value"); 1405 } 1406 1407 { 1408 vh.set(array, i, VALUE_1); 1409 1410 long o = (long) vh.getAndBitwiseAndRelease(array, i, VALUE_2); 1411 assertEquals(o, VALUE_1, "getAndBitwiseAndRelease long"); 1412 long x = (long) vh.get(array, i); 1413 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndRelease long value"); 1414 } 1415 1416 // get and bitwise xor 1417 { 1418 vh.set(array, i, VALUE_1); 1419 1420 long o = (long) vh.getAndBitwiseXor(array, i, VALUE_2); 1421 assertEquals(o, VALUE_1, "getAndBitwiseXor long"); 1422 long x = (long) vh.get(array, i); 1423 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXor long value"); 1424 } 1425 1426 { 1427 vh.set(array, i, VALUE_1); 1428 1429 long o = (long) vh.getAndBitwiseXorAcquire(array, i, VALUE_2); 1430 assertEquals(o, VALUE_1, "getAndBitwiseXorAcquire long"); 1431 long x = (long) vh.get(array, i); 1432 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorAcquire long value"); 1433 } 1434 1435 { 1436 vh.set(array, i, VALUE_1); 1437 1438 long o = (long) vh.getAndBitwiseXorRelease(array, i, VALUE_2); 1439 assertEquals(o, VALUE_1, "getAndBitwiseXorRelease long"); 1440 long x = (long) vh.get(array, i); 1441 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorRelease long value"); 1442 } 1443 } 1444 } 1445 } 1446 1447 testArrayReadWrite(ByteBufferSource bs, VarHandleSource vhs)1448 static void testArrayReadWrite(ByteBufferSource bs, VarHandleSource vhs) { 1449 VarHandle vh = vhs.s; 1450 ByteBuffer array = bs.s; 1451 1452 int misalignmentAtZero = array.alignmentOffset(0, SIZE); 1453 1454 bs.fill((byte) 0xff); 1455 int length = array.limit() - SIZE + 1; 1456 for (int i = 0; i < length; i++) { 1457 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0; 1458 1459 // Plain 1460 { 1461 vh.set(array, i, VALUE_1); 1462 long x = (long) vh.get(array, i); 1463 assertEquals(x, VALUE_1, "get long value"); 1464 } 1465 1466 if (iAligned) { 1467 // Volatile 1468 { 1469 vh.setVolatile(array, i, VALUE_2); 1470 long x = (long) vh.getVolatile(array, i); 1471 assertEquals(x, VALUE_2, "setVolatile long value"); 1472 } 1473 1474 // Lazy 1475 { 1476 vh.setRelease(array, i, VALUE_1); 1477 long x = (long) vh.getAcquire(array, i); 1478 assertEquals(x, VALUE_1, "setRelease long value"); 1479 } 1480 1481 // Opaque 1482 { 1483 vh.setOpaque(array, i, VALUE_2); 1484 long x = (long) vh.getOpaque(array, i); 1485 assertEquals(x, VALUE_2, "setOpaque long value"); 1486 } 1487 1488 vh.set(array, i, VALUE_1); 1489 1490 // Compare 1491 { 1492 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2); 1493 assertEquals(r, true, "success compareAndSet long"); 1494 long x = (long) vh.get(array, i); 1495 assertEquals(x, VALUE_2, "success compareAndSet long value"); 1496 } 1497 1498 { 1499 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3); 1500 assertEquals(r, false, "failing compareAndSet long"); 1501 long x = (long) vh.get(array, i); 1502 assertEquals(x, VALUE_2, "failing compareAndSet long value"); 1503 } 1504 1505 { 1506 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_1); 1507 assertEquals(r, VALUE_2, "success compareAndExchange long"); 1508 long x = (long) vh.get(array, i); 1509 assertEquals(x, VALUE_1, "success compareAndExchange long value"); 1510 } 1511 1512 { 1513 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_3); 1514 assertEquals(r, VALUE_1, "failing compareAndExchange long"); 1515 long x = (long) vh.get(array, i); 1516 assertEquals(x, VALUE_1, "failing compareAndExchange long value"); 1517 } 1518 1519 { 1520 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2); 1521 assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long"); 1522 long x = (long) vh.get(array, i); 1523 assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value"); 1524 } 1525 1526 { 1527 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3); 1528 assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long"); 1529 long x = (long) vh.get(array, i); 1530 assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value"); 1531 } 1532 1533 { 1534 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1); 1535 assertEquals(r, VALUE_2, "success compareAndExchangeRelease long"); 1536 long x = (long) vh.get(array, i); 1537 assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value"); 1538 } 1539 1540 { 1541 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3); 1542 assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long"); 1543 long x = (long) vh.get(array, i); 1544 assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value"); 1545 } 1546 1547 { 1548 boolean success = false; 1549 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1550 success = vh.weakCompareAndSetPlain(array, i, VALUE_1, VALUE_2); 1551 } 1552 assertEquals(success, true, "weakCompareAndSetPlain long"); 1553 long x = (long) vh.get(array, i); 1554 assertEquals(x, VALUE_2, "weakCompareAndSetPlain long value"); 1555 } 1556 1557 { 1558 boolean success = false; 1559 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1560 success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1); 1561 } 1562 assertEquals(success, true, "weakCompareAndSetAcquire long"); 1563 long x = (long) vh.get(array, i); 1564 assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long"); 1565 } 1566 1567 { 1568 boolean success = false; 1569 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1570 success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2); 1571 } 1572 assertEquals(success, true, "weakCompareAndSetRelease long"); 1573 long x = (long) vh.get(array, i); 1574 assertEquals(x, VALUE_2, "weakCompareAndSetRelease long"); 1575 } 1576 1577 { 1578 boolean success = false; 1579 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1580 success = vh.weakCompareAndSet(array, i, VALUE_2, VALUE_1); 1581 } 1582 assertEquals(success, true, "weakCompareAndSet long"); 1583 long x = (long) vh.get(array, i); 1584 assertEquals(x, VALUE_1, "weakCompareAndSet long"); 1585 } 1586 1587 // Compare set and get 1588 { 1589 vh.set(array, i, VALUE_1); 1590 1591 long o = (long) vh.getAndSet(array, i, VALUE_2); 1592 assertEquals(o, VALUE_1, "getAndSet long"); 1593 long x = (long) vh.get(array, i); 1594 assertEquals(x, VALUE_2, "getAndSet long value"); 1595 } 1596 1597 { 1598 vh.set(array, i, VALUE_1); 1599 1600 long o = (long) vh.getAndSetAcquire(array, i, VALUE_2); 1601 assertEquals(o, VALUE_1, "getAndSetAcquire long"); 1602 long x = (long) vh.get(array, i); 1603 assertEquals(x, VALUE_2, "getAndSetAcquire long value"); 1604 } 1605 1606 { 1607 vh.set(array, i, VALUE_1); 1608 1609 long o = (long) vh.getAndSetRelease(array, i, VALUE_2); 1610 assertEquals(o, VALUE_1, "getAndSetRelease long"); 1611 long x = (long) vh.get(array, i); 1612 assertEquals(x, VALUE_2, "getAndSetRelease long value"); 1613 } 1614 1615 // get and add, add and get 1616 { 1617 vh.set(array, i, VALUE_1); 1618 1619 long o = (long) vh.getAndAdd(array, i, VALUE_2); 1620 assertEquals(o, VALUE_1, "getAndAdd long"); 1621 long x = (long) vh.get(array, i); 1622 assertEquals(x, VALUE_1 + VALUE_2, "getAndAdd long value"); 1623 } 1624 1625 { 1626 vh.set(array, i, VALUE_1); 1627 1628 long o = (long) vh.getAndAddAcquire(array, i, VALUE_2); 1629 assertEquals(o, VALUE_1, "getAndAddAcquire long"); 1630 long x = (long) vh.get(array, i); 1631 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddAcquire long value"); 1632 } 1633 1634 { 1635 vh.set(array, i, VALUE_1); 1636 1637 long o = (long) vh.getAndAddRelease(array, i, VALUE_2); 1638 assertEquals(o, VALUE_1, "getAndAddRelease long"); 1639 long x = (long) vh.get(array, i); 1640 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddRelease long value"); 1641 } 1642 1643 // get and bitwise or 1644 { 1645 vh.set(array, i, VALUE_1); 1646 1647 long o = (long) vh.getAndBitwiseOr(array, i, VALUE_2); 1648 assertEquals(o, VALUE_1, "getAndBitwiseOr long"); 1649 long x = (long) vh.get(array, i); 1650 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOr long value"); 1651 } 1652 1653 { 1654 vh.set(array, i, VALUE_1); 1655 1656 long o = (long) vh.getAndBitwiseOrAcquire(array, i, VALUE_2); 1657 assertEquals(o, VALUE_1, "getAndBitwiseOrAcquire long"); 1658 long x = (long) vh.get(array, i); 1659 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrAcquire long value"); 1660 } 1661 1662 { 1663 vh.set(array, i, VALUE_1); 1664 1665 long o = (long) vh.getAndBitwiseOrRelease(array, i, VALUE_2); 1666 assertEquals(o, VALUE_1, "getAndBitwiseOrRelease long"); 1667 long x = (long) vh.get(array, i); 1668 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrRelease long value"); 1669 } 1670 1671 // get and bitwise and 1672 { 1673 vh.set(array, i, VALUE_1); 1674 1675 long o = (long) vh.getAndBitwiseAnd(array, i, VALUE_2); 1676 assertEquals(o, VALUE_1, "getAndBitwiseAnd long"); 1677 long x = (long) vh.get(array, i); 1678 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAnd long value"); 1679 } 1680 1681 { 1682 vh.set(array, i, VALUE_1); 1683 1684 long o = (long) vh.getAndBitwiseAndAcquire(array, i, VALUE_2); 1685 assertEquals(o, VALUE_1, "getAndBitwiseAndAcquire long"); 1686 long x = (long) vh.get(array, i); 1687 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndAcquire long value"); 1688 } 1689 1690 { 1691 vh.set(array, i, VALUE_1); 1692 1693 long o = (long) vh.getAndBitwiseAndRelease(array, i, VALUE_2); 1694 assertEquals(o, VALUE_1, "getAndBitwiseAndRelease long"); 1695 long x = (long) vh.get(array, i); 1696 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndRelease long value"); 1697 } 1698 1699 // get and bitwise xor 1700 { 1701 vh.set(array, i, VALUE_1); 1702 1703 long o = (long) vh.getAndBitwiseXor(array, i, VALUE_2); 1704 assertEquals(o, VALUE_1, "getAndBitwiseXor long"); 1705 long x = (long) vh.get(array, i); 1706 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXor long value"); 1707 } 1708 1709 { 1710 vh.set(array, i, VALUE_1); 1711 1712 long o = (long) vh.getAndBitwiseXorAcquire(array, i, VALUE_2); 1713 assertEquals(o, VALUE_1, "getAndBitwiseXorAcquire long"); 1714 long x = (long) vh.get(array, i); 1715 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorAcquire long value"); 1716 } 1717 1718 { 1719 vh.set(array, i, VALUE_1); 1720 1721 long o = (long) vh.getAndBitwiseXorRelease(array, i, VALUE_2); 1722 assertEquals(o, VALUE_1, "getAndBitwiseXorRelease long"); 1723 long x = (long) vh.get(array, i); 1724 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorRelease long value"); 1725 } 1726 } 1727 } 1728 } 1729 testArrayReadOnly(ByteBufferSource bs, VarHandleSource vhs)1730 static void testArrayReadOnly(ByteBufferSource bs, VarHandleSource vhs) { 1731 VarHandle vh = vhs.s; 1732 ByteBuffer array = bs.s; 1733 1734 int misalignmentAtZero = array.alignmentOffset(0, SIZE); 1735 1736 ByteBuffer bb = ByteBuffer.allocate(SIZE); 1737 bb.order(MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes) ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); 1738 bs.fill(bb.putLong(0, VALUE_2).array()); 1739 1740 int length = array.limit() - SIZE + 1; 1741 for (int i = 0; i < length; i++) { 1742 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0; 1743 1744 long v = MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes) 1745 ? rotateLeft(VALUE_2, (i % SIZE) << 3) 1746 : rotateRight(VALUE_2, (i % SIZE) << 3); 1747 // Plain 1748 { 1749 long x = (long) vh.get(array, i); 1750 assertEquals(x, v, "get long value"); 1751 } 1752 1753 if (iAligned) { 1754 // Volatile 1755 { 1756 long x = (long) vh.getVolatile(array, i); 1757 assertEquals(x, v, "getVolatile long value"); 1758 } 1759 1760 // Lazy 1761 { 1762 long x = (long) vh.getAcquire(array, i); 1763 assertEquals(x, v, "getRelease long value"); 1764 } 1765 1766 // Opaque 1767 { 1768 long x = (long) vh.getOpaque(array, i); 1769 assertEquals(x, v, "getOpaque long value"); 1770 } 1771 } 1772 } 1773 } 1774 1775 } 1776 1777