1 /* 2 * Copyright (c) 2015, 2024, 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 // -- This file was mechanically generated: Do not edit! -- // 25 26 /* 27 * @test 28 * @enablePreview 29 * @modules java.base/jdk.internal.vm.annotation 30 * @run testng/othervm -Diters=10 -Xint VarHandleTestAccessValue 31 * 32 * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations 33 * to hit compilation thresholds 34 * 35 * @run testng/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:TieredStopAtLevel=1 VarHandleTestAccessValue 36 * @run testng/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 VarHandleTestAccessValue 37 * @run testng/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:-TieredCompilation VarHandleTestAccessValue 38 */ 39 40 import org.testng.annotations.BeforeClass; 41 import org.testng.annotations.DataProvider; 42 import org.testng.annotations.Test; 43 44 import java.lang.invoke.MethodHandles; 45 import java.lang.invoke.VarHandle; 46 import java.util.ArrayList; 47 import java.util.Arrays; 48 import java.util.List; 49 50 import static org.testng.Assert.*; 51 52 public class VarHandleTestAccessValue extends VarHandleBaseTest { 53 static final Value static_final_v = Value.getInstance(10); 54 55 static Value static_v; 56 57 final Value final_v = Value.getInstance(10); 58 59 Value v; 60 61 static final Value static_final_v2 = Value.getInstance(10); 62 63 static Value static_v2; 64 65 final Value final_v2 = Value.getInstance(10); 66 67 Value v2; 68 69 VarHandle vhFinalField; 70 71 VarHandle vhField; 72 73 VarHandle vhStaticField; 74 75 VarHandle vhStaticFinalField; 76 77 VarHandle vhArray; 78 79 VarHandle vhArrayObject; 80 81 VarHandle[] allocate(boolean same) { 82 List<VarHandle> vhs = new ArrayList<>(); 83 84 String postfix = same ? "" : "2"; 85 VarHandle vh; 86 try { 87 vh = MethodHandles.lookup().findVarHandle( 88 VarHandleTestAccessValue.class, "final_v" + postfix, Value.class); 89 vhs.add(vh); 90 91 vh = MethodHandles.lookup().findVarHandle( 92 VarHandleTestAccessValue.class, "v" + postfix, Value.class); 93 vhs.add(vh); 94 95 vh = MethodHandles.lookup().findStaticVarHandle( 96 VarHandleTestAccessValue.class, "static_final_v" + postfix, Value.class); 97 vhs.add(vh); 98 99 vh = MethodHandles.lookup().findStaticVarHandle( 100 VarHandleTestAccessValue.class, "static_v" + postfix, Value.class); 101 vhs.add(vh); 102 103 if (same) { 104 vh = MethodHandles.arrayElementVarHandle(Value[].class); 105 } 106 else { 107 vh = MethodHandles.arrayElementVarHandle(String[].class); 108 } 109 vhs.add(vh); 110 } catch (Exception e) { 111 throw new InternalError(e); 112 } 113 return vhs.toArray(new VarHandle[0]); 114 } 115 116 @BeforeClass 117 public void setup() throws Exception { 118 vhFinalField = MethodHandles.lookup().findVarHandle( 119 VarHandleTestAccessValue.class, "final_v", Value.class); 120 121 vhField = MethodHandles.lookup().findVarHandle( 122 VarHandleTestAccessValue.class, "v", Value.class); 123 124 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle( 125 VarHandleTestAccessValue.class, "static_final_v", Value.class); 126 127 vhStaticField = MethodHandles.lookup().findStaticVarHandle( 128 VarHandleTestAccessValue.class, "static_v", Value.class); 129 130 vhArray = MethodHandles.arrayElementVarHandle(Value[].class); 131 vhArrayObject = MethodHandles.arrayElementVarHandle(Object[].class); 132 } 133 134 135 @DataProvider 136 public Object[][] varHandlesProvider() throws Exception { 137 List<VarHandle> vhs = new ArrayList<>(); 138 vhs.add(vhField); 139 vhs.add(vhStaticField); 140 vhs.add(vhArray); 141 142 return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); 143 } 144 145 @Test 146 public void testEquals() { 147 VarHandle[] vhs1 = allocate(true); 148 VarHandle[] vhs2 = allocate(true); 149 150 for (int i = 0; i < vhs1.length; i++) { 151 for (int j = 0; j < vhs1.length; j++) { 152 if (i != j) { 153 assertNotEquals(vhs1[i], vhs1[j]); 154 assertNotEquals(vhs1[i], vhs2[j]); 155 } 156 } 157 } 158 159 VarHandle[] vhs3 = allocate(false); 160 for (int i = 0; i < vhs1.length; i++) { 161 assertNotEquals(vhs1[i], vhs3[i]); 162 } 163 } 164 165 @Test(dataProvider = "varHandlesProvider") 166 public void testIsAccessModeSupported(VarHandle vh) { 167 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); 168 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET)); 169 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE)); 170 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE)); 171 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE)); 172 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE)); 173 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE)); 174 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE)); 175 176 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET)); 177 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE)); 178 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); 179 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); 180 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN)); 181 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); 182 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); 183 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); 184 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); 185 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE)); 186 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE)); 187 188 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); 189 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE)); 190 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE)); 191 192 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR)); 193 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)); 194 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)); 195 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND)); 196 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)); 197 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)); 198 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR)); 199 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)); 200 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE)); 201 } 202 203 204 @DataProvider 205 public Object[][] typesProvider() throws Exception { 206 List<Object[]> types = new ArrayList<>(); 207 types.add(new Object[] {vhField, Arrays.asList(VarHandleTestAccessValue.class)}); 208 types.add(new Object[] {vhStaticField, Arrays.asList()}); 209 types.add(new Object[] {vhArray, Arrays.asList(Value[].class, int.class)}); 210 211 return types.stream().toArray(Object[][]::new); 212 } 213 214 @Test(dataProvider = "typesProvider") 215 public void testTypes(VarHandle vh, List<Class<?>> pts) { 216 assertEquals(vh.varType(), Value.class); 217 218 assertEquals(vh.coordinateTypes(), pts); 219 220 testTypes(vh); 221 } 222 223 224 @Test 225 public void testLookupInstanceToStatic() { 226 checkIAE("Lookup of static final field to instance final field", () -> { 227 MethodHandles.lookup().findStaticVarHandle( 228 VarHandleTestAccessValue.class, "final_v", Value.class); 229 }); 230 231 checkIAE("Lookup of static field to instance field", () -> { 232 MethodHandles.lookup().findStaticVarHandle( 233 VarHandleTestAccessValue.class, "v", Value.class); 234 }); 235 } 236 237 @Test 238 public void testLookupStaticToInstance() { 239 checkIAE("Lookup of instance final field to static final field", () -> { 240 MethodHandles.lookup().findVarHandle( 241 VarHandleTestAccessValue.class, "static_final_v", Value.class); 242 }); 243 244 checkIAE("Lookup of instance field to static field", () -> { 245 vhStaticField = MethodHandles.lookup().findVarHandle( 246 VarHandleTestAccessValue.class, "static_v", Value.class); 247 }); 248 } 249 250 251 @DataProvider 252 public Object[][] accessTestCaseProvider() throws Exception { 253 List<AccessTestCase<?>> cases = new ArrayList<>(); 254 255 cases.add(new VarHandleAccessTestCase("Instance final field", 256 vhFinalField, vh -> testInstanceFinalField(this, vh))); 257 cases.add(new VarHandleAccessTestCase("Instance final field unsupported", 258 vhFinalField, vh -> testInstanceFinalFieldUnsupported(this, vh), 259 false)); 260 261 cases.add(new VarHandleAccessTestCase("Static final field", 262 vhStaticFinalField, VarHandleTestAccessValue::testStaticFinalField)); 263 cases.add(new VarHandleAccessTestCase("Static final field unsupported", 264 vhStaticFinalField, VarHandleTestAccessValue::testStaticFinalFieldUnsupported, 265 false)); 266 267 cases.add(new VarHandleAccessTestCase("Instance field", 268 vhField, vh -> testInstanceField(this, vh))); 269 cases.add(new VarHandleAccessTestCase("Instance field unsupported", 270 vhField, vh -> testInstanceFieldUnsupported(this, vh), 271 false)); 272 273 cases.add(new VarHandleAccessTestCase("Static field", 274 vhStaticField, VarHandleTestAccessValue::testStaticField)); 275 cases.add(new VarHandleAccessTestCase("Static field unsupported", 276 vhStaticField, VarHandleTestAccessValue::testStaticFieldUnsupported, 277 false)); 278 279 cases.add(new VarHandleAccessTestCase("Array", 280 vhArray, VarHandleTestAccessValue::testArray)); 281 cases.add(new VarHandleAccessTestCase("Array Object[]", 282 vhArrayObject, VarHandleTestAccessValue::testArray)); 283 cases.add(new VarHandleAccessTestCase("Array unsupported", 284 vhArray, VarHandleTestAccessValue::testArrayUnsupported, 285 false)); 286 cases.add(new VarHandleAccessTestCase("Array index out of bounds", 287 vhArray, VarHandleTestAccessValue::testArrayIndexOutOfBounds, 288 false)); 289 cases.add(new VarHandleAccessTestCase("Array store exception", 290 vhArrayObject, VarHandleTestAccessValue::testArrayStoreException, 291 false)); 292 // Work around issue with jtreg summary reporting which truncates 293 // the String result of Object.toString to 30 characters, hence 294 // the first dummy argument 295 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new); 296 } 297 298 @Test(dataProvider = "accessTestCaseProvider") 299 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 300 T t = atc.get(); 301 int iters = atc.requiresLoop() ? ITERS : 1; 302 for (int c = 0; c < iters; c++) { 303 atc.testAccess(t); 304 } 305 } 306 307 static void testInstanceFinalField(VarHandleTestAccessValue recv, VarHandle vh) { 308 // Plain 309 { 310 Value x = (Value) vh.get(recv); 311 assertEquals(x, Value.getInstance(10), "get Value value"); 312 } 313 314 315 // Volatile 316 { 317 Value x = (Value) vh.getVolatile(recv); 318 assertEquals(x, Value.getInstance(10), "getVolatile Value value"); 319 } 320 321 // Lazy 322 { 323 Value x = (Value) vh.getAcquire(recv); 324 assertEquals(x, Value.getInstance(10), "getRelease Value value"); 325 } 326 327 // Opaque 328 { 329 Value x = (Value) vh.getOpaque(recv); 330 assertEquals(x, Value.getInstance(10), "getOpaque Value value"); 331 } 332 } 333 334 static void testInstanceFinalFieldUnsupported(VarHandleTestAccessValue recv, VarHandle vh) { 335 checkUOE(() -> { 336 vh.set(recv, Value.getInstance(20)); 337 }); 338 339 checkUOE(() -> { 340 vh.setVolatile(recv, Value.getInstance(20)); 341 }); 342 343 checkUOE(() -> { 344 vh.setRelease(recv, Value.getInstance(20)); 345 }); 346 347 checkUOE(() -> { 348 vh.setOpaque(recv, Value.getInstance(20)); 349 }); 350 351 352 checkUOE(() -> { 353 Value o = (Value) vh.getAndAdd(recv, Value.getInstance(10)); 354 }); 355 356 checkUOE(() -> { 357 Value o = (Value) vh.getAndAddAcquire(recv, Value.getInstance(10)); 358 }); 359 360 checkUOE(() -> { 361 Value o = (Value) vh.getAndAddRelease(recv, Value.getInstance(10)); 362 }); 363 364 checkUOE(() -> { 365 Value o = (Value) vh.getAndBitwiseOr(recv, Value.getInstance(10)); 366 }); 367 368 checkUOE(() -> { 369 Value o = (Value) vh.getAndBitwiseOrAcquire(recv, Value.getInstance(10)); 370 }); 371 372 checkUOE(() -> { 373 Value o = (Value) vh.getAndBitwiseOrRelease(recv, Value.getInstance(10)); 374 }); 375 376 checkUOE(() -> { 377 Value o = (Value) vh.getAndBitwiseAnd(recv, Value.getInstance(10)); 378 }); 379 380 checkUOE(() -> { 381 Value o = (Value) vh.getAndBitwiseAndAcquire(recv, Value.getInstance(10)); 382 }); 383 384 checkUOE(() -> { 385 Value o = (Value) vh.getAndBitwiseAndRelease(recv, Value.getInstance(10)); 386 }); 387 388 checkUOE(() -> { 389 Value o = (Value) vh.getAndBitwiseXor(recv, Value.getInstance(10)); 390 }); 391 392 checkUOE(() -> { 393 Value o = (Value) vh.getAndBitwiseXorAcquire(recv, Value.getInstance(10)); 394 }); 395 396 checkUOE(() -> { 397 Value o = (Value) vh.getAndBitwiseXorRelease(recv, Value.getInstance(10)); 398 }); 399 } 400 401 402 static void testStaticFinalField(VarHandle vh) { 403 // Plain 404 { 405 Value x = (Value) vh.get(); 406 assertEquals(x, Value.getInstance(10), "get Value value"); 407 } 408 409 410 // Volatile 411 { 412 Value x = (Value) vh.getVolatile(); 413 assertEquals(x, Value.getInstance(10), "getVolatile Value value"); 414 } 415 416 // Lazy 417 { 418 Value x = (Value) vh.getAcquire(); 419 assertEquals(x, Value.getInstance(10), "getRelease Value value"); 420 } 421 422 // Opaque 423 { 424 Value x = (Value) vh.getOpaque(); 425 assertEquals(x, Value.getInstance(10), "getOpaque Value value"); 426 } 427 } 428 429 static void testStaticFinalFieldUnsupported(VarHandle vh) { 430 checkUOE(() -> { 431 vh.set(Value.getInstance(20)); 432 }); 433 434 checkUOE(() -> { 435 vh.setVolatile(Value.getInstance(20)); 436 }); 437 438 checkUOE(() -> { 439 vh.setRelease(Value.getInstance(20)); 440 }); 441 442 checkUOE(() -> { 443 vh.setOpaque(Value.getInstance(20)); 444 }); 445 446 447 checkUOE(() -> { 448 Value o = (Value) vh.getAndAdd(Value.getInstance(10)); 449 }); 450 451 checkUOE(() -> { 452 Value o = (Value) vh.getAndAddAcquire(Value.getInstance(10)); 453 }); 454 455 checkUOE(() -> { 456 Value o = (Value) vh.getAndAddRelease(Value.getInstance(10)); 457 }); 458 459 checkUOE(() -> { 460 Value o = (Value) vh.getAndBitwiseOr(Value.getInstance(10)); 461 }); 462 463 checkUOE(() -> { 464 Value o = (Value) vh.getAndBitwiseOrAcquire(Value.getInstance(10)); 465 }); 466 467 checkUOE(() -> { 468 Value o = (Value) vh.getAndBitwiseOrRelease(Value.getInstance(10)); 469 }); 470 471 checkUOE(() -> { 472 Value o = (Value) vh.getAndBitwiseAnd(Value.getInstance(10)); 473 }); 474 475 checkUOE(() -> { 476 Value o = (Value) vh.getAndBitwiseAndAcquire(Value.getInstance(10)); 477 }); 478 479 checkUOE(() -> { 480 Value o = (Value) vh.getAndBitwiseAndRelease(Value.getInstance(10)); 481 }); 482 483 checkUOE(() -> { 484 Value o = (Value) vh.getAndBitwiseXor(Value.getInstance(10)); 485 }); 486 487 checkUOE(() -> { 488 Value o = (Value) vh.getAndBitwiseXorAcquire(Value.getInstance(10)); 489 }); 490 491 checkUOE(() -> { 492 Value o = (Value) vh.getAndBitwiseXorRelease(Value.getInstance(10)); 493 }); 494 } 495 496 497 static void testInstanceField(VarHandleTestAccessValue recv, VarHandle vh) { 498 // Plain 499 { 500 vh.set(recv, Value.getInstance(10)); 501 Value x = (Value) vh.get(recv); 502 assertEquals(x, Value.getInstance(10), "set Value value"); 503 } 504 505 506 // Volatile 507 { 508 vh.setVolatile(recv, Value.getInstance(20)); 509 Value x = (Value) vh.getVolatile(recv); 510 assertEquals(x, Value.getInstance(20), "setVolatile Value value"); 511 } 512 513 // Lazy 514 { 515 vh.setRelease(recv, Value.getInstance(10)); 516 Value x = (Value) vh.getAcquire(recv); 517 assertEquals(x, Value.getInstance(10), "setRelease Value value"); 518 } 519 520 // Opaque 521 { 522 vh.setOpaque(recv, Value.getInstance(20)); 523 Value x = (Value) vh.getOpaque(recv); 524 assertEquals(x, Value.getInstance(20), "setOpaque Value value"); 525 } 526 527 vh.set(recv, Value.getInstance(10)); 528 529 // Compare 530 { 531 boolean r = vh.compareAndSet(recv, Value.getInstance(10), Value.getInstance(20)); 532 assertEquals(r, true, "success compareAndSet Value"); 533 Value x = (Value) vh.get(recv); 534 assertEquals(x, Value.getInstance(20), "success compareAndSet Value value"); 535 } 536 537 { 538 boolean r = vh.compareAndSet(recv, Value.getInstance(10), Value.getInstance(30)); 539 assertEquals(r, false, "failing compareAndSet Value"); 540 Value x = (Value) vh.get(recv); 541 assertEquals(x, Value.getInstance(20), "failing compareAndSet Value value"); 542 } 543 544 { 545 Value r = (Value) vh.compareAndExchange(recv, Value.getInstance(20), Value.getInstance(10)); 546 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value"); 547 Value x = (Value) vh.get(recv); 548 assertEquals(x, Value.getInstance(10), "success compareAndExchange Value value"); 549 } 550 551 { 552 Value r = (Value) vh.compareAndExchange(recv, Value.getInstance(20), Value.getInstance(30)); 553 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value"); 554 Value x = (Value) vh.get(recv); 555 assertEquals(x, Value.getInstance(10), "failing compareAndExchange Value value"); 556 } 557 558 { 559 Value r = (Value) vh.compareAndExchangeAcquire(recv, Value.getInstance(10), Value.getInstance(20)); 560 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value"); 561 Value x = (Value) vh.get(recv); 562 assertEquals(x, Value.getInstance(20), "success compareAndExchangeAcquire Value value"); 563 } 564 565 { 566 Value r = (Value) vh.compareAndExchangeAcquire(recv, Value.getInstance(10), Value.getInstance(30)); 567 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value"); 568 Value x = (Value) vh.get(recv); 569 assertEquals(x, Value.getInstance(20), "failing compareAndExchangeAcquire Value value"); 570 } 571 572 { 573 Value r = (Value) vh.compareAndExchangeRelease(recv, Value.getInstance(20), Value.getInstance(10)); 574 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value"); 575 Value x = (Value) vh.get(recv); 576 assertEquals(x, Value.getInstance(10), "success compareAndExchangeRelease Value value"); 577 } 578 579 { 580 Value r = (Value) vh.compareAndExchangeRelease(recv, Value.getInstance(20), Value.getInstance(30)); 581 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value"); 582 Value x = (Value) vh.get(recv); 583 assertEquals(x, Value.getInstance(10), "failing compareAndExchangeRelease Value value"); 584 } 585 586 { 587 boolean success = false; 588 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 589 success = vh.weakCompareAndSetPlain(recv, Value.getInstance(10), Value.getInstance(20)); 590 if (!success) weakDelay(); 591 } 592 assertEquals(success, true, "success weakCompareAndSetPlain Value"); 593 Value x = (Value) vh.get(recv); 594 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetPlain Value value"); 595 } 596 597 { 598 boolean success = vh.weakCompareAndSetPlain(recv, Value.getInstance(10), Value.getInstance(30)); 599 assertEquals(success, false, "failing weakCompareAndSetPlain Value"); 600 Value x = (Value) vh.get(recv); 601 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetPlain Value value"); 602 } 603 604 { 605 boolean success = false; 606 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 607 success = vh.weakCompareAndSetAcquire(recv, Value.getInstance(20), Value.getInstance(10)); 608 if (!success) weakDelay(); 609 } 610 assertEquals(success, true, "success weakCompareAndSetAcquire Value"); 611 Value x = (Value) vh.get(recv); 612 assertEquals(x, Value.getInstance(10), "success weakCompareAndSetAcquire Value"); 613 } 614 615 { 616 boolean success = vh.weakCompareAndSetAcquire(recv, Value.getInstance(20), Value.getInstance(30)); 617 assertEquals(success, false, "failing weakCompareAndSetAcquire Value"); 618 Value x = (Value) vh.get(recv); 619 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSetAcquire Value value"); 620 } 621 622 { 623 boolean success = false; 624 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 625 success = vh.weakCompareAndSetRelease(recv, Value.getInstance(10), Value.getInstance(20)); 626 if (!success) weakDelay(); 627 } 628 assertEquals(success, true, "success weakCompareAndSetRelease Value"); 629 Value x = (Value) vh.get(recv); 630 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetRelease Value"); 631 } 632 633 { 634 boolean success = vh.weakCompareAndSetRelease(recv, Value.getInstance(10), Value.getInstance(30)); 635 assertEquals(success, false, "failing weakCompareAndSetRelease Value"); 636 Value x = (Value) vh.get(recv); 637 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetRelease Value value"); 638 } 639 640 { 641 boolean success = false; 642 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 643 success = vh.weakCompareAndSet(recv, Value.getInstance(20), Value.getInstance(10)); 644 if (!success) weakDelay(); 645 } 646 assertEquals(success, true, "success weakCompareAndSet Value"); 647 Value x = (Value) vh.get(recv); 648 assertEquals(x, Value.getInstance(10), "success weakCompareAndSet Value value"); 649 } 650 651 { 652 boolean success = vh.weakCompareAndSet(recv, Value.getInstance(20), Value.getInstance(30)); 653 assertEquals(success, false, "failing weakCompareAndSet Value"); 654 Value x = (Value) vh.get(recv); 655 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSet Value value"); 656 } 657 658 // Compare set and get 659 { 660 vh.set(recv, Value.getInstance(10)); 661 662 Value o = (Value) vh.getAndSet(recv, Value.getInstance(20)); 663 assertEquals(o, Value.getInstance(10), "getAndSet Value"); 664 Value x = (Value) vh.get(recv); 665 assertEquals(x, Value.getInstance(20), "getAndSet Value value"); 666 } 667 668 { 669 vh.set(recv, Value.getInstance(10)); 670 671 Value o = (Value) vh.getAndSetAcquire(recv, Value.getInstance(20)); 672 assertEquals(o, Value.getInstance(10), "getAndSetAcquire Value"); 673 Value x = (Value) vh.get(recv); 674 assertEquals(x, Value.getInstance(20), "getAndSetAcquire Value value"); 675 } 676 677 { 678 vh.set(recv, Value.getInstance(10)); 679 680 Value o = (Value) vh.getAndSetRelease(recv, Value.getInstance(20)); 681 assertEquals(o, Value.getInstance(10), "getAndSetRelease Value"); 682 Value x = (Value) vh.get(recv); 683 assertEquals(x, Value.getInstance(20), "getAndSetRelease Value value"); 684 } 685 686 687 } 688 689 static void testInstanceFieldUnsupported(VarHandleTestAccessValue recv, VarHandle vh) { 690 691 checkUOE(() -> { 692 Value o = (Value) vh.getAndAdd(recv, Value.getInstance(10)); 693 }); 694 695 checkUOE(() -> { 696 Value o = (Value) vh.getAndAddAcquire(recv, Value.getInstance(10)); 697 }); 698 699 checkUOE(() -> { 700 Value o = (Value) vh.getAndAddRelease(recv, Value.getInstance(10)); 701 }); 702 703 checkUOE(() -> { 704 Value o = (Value) vh.getAndBitwiseOr(recv, Value.getInstance(10)); 705 }); 706 707 checkUOE(() -> { 708 Value o = (Value) vh.getAndBitwiseOrAcquire(recv, Value.getInstance(10)); 709 }); 710 711 checkUOE(() -> { 712 Value o = (Value) vh.getAndBitwiseOrRelease(recv, Value.getInstance(10)); 713 }); 714 715 checkUOE(() -> { 716 Value o = (Value) vh.getAndBitwiseAnd(recv, Value.getInstance(10)); 717 }); 718 719 checkUOE(() -> { 720 Value o = (Value) vh.getAndBitwiseAndAcquire(recv, Value.getInstance(10)); 721 }); 722 723 checkUOE(() -> { 724 Value o = (Value) vh.getAndBitwiseAndRelease(recv, Value.getInstance(10)); 725 }); 726 727 checkUOE(() -> { 728 Value o = (Value) vh.getAndBitwiseXor(recv, Value.getInstance(10)); 729 }); 730 731 checkUOE(() -> { 732 Value o = (Value) vh.getAndBitwiseXorAcquire(recv, Value.getInstance(10)); 733 }); 734 735 checkUOE(() -> { 736 Value o = (Value) vh.getAndBitwiseXorRelease(recv, Value.getInstance(10)); 737 }); 738 } 739 740 741 static void testStaticField(VarHandle vh) { 742 // Plain 743 { 744 vh.set(Value.getInstance(10)); 745 Value x = (Value) vh.get(); 746 assertEquals(x, Value.getInstance(10), "set Value value"); 747 } 748 749 750 // Volatile 751 { 752 vh.setVolatile(Value.getInstance(20)); 753 Value x = (Value) vh.getVolatile(); 754 assertEquals(x, Value.getInstance(20), "setVolatile Value value"); 755 } 756 757 // Lazy 758 { 759 vh.setRelease(Value.getInstance(10)); 760 Value x = (Value) vh.getAcquire(); 761 assertEquals(x, Value.getInstance(10), "setRelease Value value"); 762 } 763 764 // Opaque 765 { 766 vh.setOpaque(Value.getInstance(20)); 767 Value x = (Value) vh.getOpaque(); 768 assertEquals(x, Value.getInstance(20), "setOpaque Value value"); 769 } 770 771 vh.set(Value.getInstance(10)); 772 773 // Compare 774 { 775 boolean r = vh.compareAndSet(Value.getInstance(10), Value.getInstance(20)); 776 assertEquals(r, true, "success compareAndSet Value"); 777 Value x = (Value) vh.get(); 778 assertEquals(x, Value.getInstance(20), "success compareAndSet Value value"); 779 } 780 781 { 782 boolean r = vh.compareAndSet(Value.getInstance(10), Value.getInstance(30)); 783 assertEquals(r, false, "failing compareAndSet Value"); 784 Value x = (Value) vh.get(); 785 assertEquals(x, Value.getInstance(20), "failing compareAndSet Value value"); 786 } 787 788 { 789 Value r = (Value) vh.compareAndExchange(Value.getInstance(20), Value.getInstance(10)); 790 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value"); 791 Value x = (Value) vh.get(); 792 assertEquals(x, Value.getInstance(10), "success compareAndExchange Value value"); 793 } 794 795 { 796 Value r = (Value) vh.compareAndExchange(Value.getInstance(20), Value.getInstance(30)); 797 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value"); 798 Value x = (Value) vh.get(); 799 assertEquals(x, Value.getInstance(10), "failing compareAndExchange Value value"); 800 } 801 802 { 803 Value r = (Value) vh.compareAndExchangeAcquire(Value.getInstance(10), Value.getInstance(20)); 804 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value"); 805 Value x = (Value) vh.get(); 806 assertEquals(x, Value.getInstance(20), "success compareAndExchangeAcquire Value value"); 807 } 808 809 { 810 Value r = (Value) vh.compareAndExchangeAcquire(Value.getInstance(10), Value.getInstance(30)); 811 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value"); 812 Value x = (Value) vh.get(); 813 assertEquals(x, Value.getInstance(20), "failing compareAndExchangeAcquire Value value"); 814 } 815 816 { 817 Value r = (Value) vh.compareAndExchangeRelease(Value.getInstance(20), Value.getInstance(10)); 818 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value"); 819 Value x = (Value) vh.get(); 820 assertEquals(x, Value.getInstance(10), "success compareAndExchangeRelease Value value"); 821 } 822 823 { 824 Value r = (Value) vh.compareAndExchangeRelease(Value.getInstance(20), Value.getInstance(30)); 825 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value"); 826 Value x = (Value) vh.get(); 827 assertEquals(x, Value.getInstance(10), "failing compareAndExchangeRelease Value value"); 828 } 829 830 { 831 boolean success = false; 832 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 833 success = vh.weakCompareAndSetPlain(Value.getInstance(10), Value.getInstance(20)); 834 if (!success) weakDelay(); 835 } 836 assertEquals(success, true, "success weakCompareAndSetPlain Value"); 837 Value x = (Value) vh.get(); 838 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetPlain Value value"); 839 } 840 841 { 842 boolean success = vh.weakCompareAndSetPlain(Value.getInstance(10), Value.getInstance(30)); 843 assertEquals(success, false, "failing weakCompareAndSetPlain Value"); 844 Value x = (Value) vh.get(); 845 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetPlain Value value"); 846 } 847 848 { 849 boolean success = false; 850 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 851 success = vh.weakCompareAndSetAcquire(Value.getInstance(20), Value.getInstance(10)); 852 if (!success) weakDelay(); 853 } 854 assertEquals(success, true, "success weakCompareAndSetAcquire Value"); 855 Value x = (Value) vh.get(); 856 assertEquals(x, Value.getInstance(10), "success weakCompareAndSetAcquire Value"); 857 } 858 859 { 860 boolean success = vh.weakCompareAndSetAcquire(Value.getInstance(20), Value.getInstance(30)); 861 assertEquals(success, false, "failing weakCompareAndSetAcquire Value"); 862 Value x = (Value) vh.get(); 863 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSetAcquire Value value"); 864 } 865 866 { 867 boolean success = false; 868 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 869 success = vh.weakCompareAndSetRelease(Value.getInstance(10), Value.getInstance(20)); 870 if (!success) weakDelay(); 871 } 872 assertEquals(success, true, "success weakCompareAndSetRelease Value"); 873 Value x = (Value) vh.get(); 874 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetRelease Value"); 875 } 876 877 { 878 boolean success = vh.weakCompareAndSetRelease(Value.getInstance(10), Value.getInstance(30)); 879 assertEquals(success, false, "failing weakCompareAndSetRelease Value"); 880 Value x = (Value) vh.get(); 881 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetRelease Value value"); 882 } 883 884 { 885 boolean success = false; 886 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 887 success = vh.weakCompareAndSet(Value.getInstance(20), Value.getInstance(10)); 888 if (!success) weakDelay(); 889 } 890 assertEquals(success, true, "success weakCompareAndSet Value"); 891 Value x = (Value) vh.get(); 892 assertEquals(x, Value.getInstance(10), "success weakCompareAndSet Value"); 893 } 894 895 { 896 boolean success = vh.weakCompareAndSet(Value.getInstance(20), Value.getInstance(30)); 897 assertEquals(success, false, "failing weakCompareAndSet Value"); 898 Value x = (Value) vh.get(); 899 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSet Value value"); 900 } 901 902 // Compare set and get 903 { 904 vh.set(Value.getInstance(10)); 905 906 Value o = (Value) vh.getAndSet(Value.getInstance(20)); 907 assertEquals(o, Value.getInstance(10), "getAndSet Value"); 908 Value x = (Value) vh.get(); 909 assertEquals(x, Value.getInstance(20), "getAndSet Value value"); 910 } 911 912 { 913 vh.set(Value.getInstance(10)); 914 915 Value o = (Value) vh.getAndSetAcquire(Value.getInstance(20)); 916 assertEquals(o, Value.getInstance(10), "getAndSetAcquire Value"); 917 Value x = (Value) vh.get(); 918 assertEquals(x, Value.getInstance(20), "getAndSetAcquire Value value"); 919 } 920 921 { 922 vh.set(Value.getInstance(10)); 923 924 Value o = (Value) vh.getAndSetRelease(Value.getInstance(20)); 925 assertEquals(o, Value.getInstance(10), "getAndSetRelease Value"); 926 Value x = (Value) vh.get(); 927 assertEquals(x, Value.getInstance(20), "getAndSetRelease Value value"); 928 } 929 930 931 } 932 933 static void testStaticFieldUnsupported(VarHandle vh) { 934 935 checkUOE(() -> { 936 Value o = (Value) vh.getAndAdd(Value.getInstance(10)); 937 }); 938 939 checkUOE(() -> { 940 Value o = (Value) vh.getAndAddAcquire(Value.getInstance(10)); 941 }); 942 943 checkUOE(() -> { 944 Value o = (Value) vh.getAndAddRelease(Value.getInstance(10)); 945 }); 946 947 checkUOE(() -> { 948 Value o = (Value) vh.getAndBitwiseOr(Value.getInstance(10)); 949 }); 950 951 checkUOE(() -> { 952 Value o = (Value) vh.getAndBitwiseOrAcquire(Value.getInstance(10)); 953 }); 954 955 checkUOE(() -> { 956 Value o = (Value) vh.getAndBitwiseOrRelease(Value.getInstance(10)); 957 }); 958 959 checkUOE(() -> { 960 Value o = (Value) vh.getAndBitwiseAnd(Value.getInstance(10)); 961 }); 962 963 checkUOE(() -> { 964 Value o = (Value) vh.getAndBitwiseAndAcquire(Value.getInstance(10)); 965 }); 966 967 checkUOE(() -> { 968 Value o = (Value) vh.getAndBitwiseAndRelease(Value.getInstance(10)); 969 }); 970 971 checkUOE(() -> { 972 Value o = (Value) vh.getAndBitwiseXor(Value.getInstance(10)); 973 }); 974 975 checkUOE(() -> { 976 Value o = (Value) vh.getAndBitwiseXorAcquire(Value.getInstance(10)); 977 }); 978 979 checkUOE(() -> { 980 Value o = (Value) vh.getAndBitwiseXorRelease(Value.getInstance(10)); 981 }); 982 } 983 984 985 static void testArray(VarHandle vh) { 986 Value[] array = new Value[10]; 987 988 for (int i = 0; i < array.length; i++) { 989 // Plain 990 { 991 vh.set(array, i, Value.getInstance(10)); 992 Value x = (Value) vh.get(array, i); 993 assertEquals(x, Value.getInstance(10), "get Value value"); 994 } 995 996 997 // Volatile 998 { 999 vh.setVolatile(array, i, Value.getInstance(20)); 1000 Value x = (Value) vh.getVolatile(array, i); 1001 assertEquals(x, Value.getInstance(20), "setVolatile Value value"); 1002 } 1003 1004 // Lazy 1005 { 1006 vh.setRelease(array, i, Value.getInstance(10)); 1007 Value x = (Value) vh.getAcquire(array, i); 1008 assertEquals(x, Value.getInstance(10), "setRelease Value value"); 1009 } 1010 1011 // Opaque 1012 { 1013 vh.setOpaque(array, i, Value.getInstance(20)); 1014 Value x = (Value) vh.getOpaque(array, i); 1015 assertEquals(x, Value.getInstance(20), "setOpaque Value value"); 1016 } 1017 1018 vh.set(array, i, Value.getInstance(10)); 1019 1020 // Compare 1021 { 1022 boolean r = vh.compareAndSet(array, i, Value.getInstance(10), Value.getInstance(20)); 1023 assertEquals(r, true, "success compareAndSet Value"); 1024 Value x = (Value) vh.get(array, i); 1025 assertEquals(x, Value.getInstance(20), "success compareAndSet Value value"); 1026 } 1027 1028 { 1029 boolean r = vh.compareAndSet(array, i, Value.getInstance(10), Value.getInstance(30)); 1030 assertEquals(r, false, "failing compareAndSet Value"); 1031 Value x = (Value) vh.get(array, i); 1032 assertEquals(x, Value.getInstance(20), "failing compareAndSet Value value"); 1033 } 1034 1035 { 1036 Value r = (Value) vh.compareAndExchange(array, i, Value.getInstance(20), Value.getInstance(10)); 1037 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value"); 1038 Value x = (Value) vh.get(array, i); 1039 assertEquals(x, Value.getInstance(10), "success compareAndExchange Value value"); 1040 } 1041 1042 { 1043 Value r = (Value) vh.compareAndExchange(array, i, Value.getInstance(20), Value.getInstance(30)); 1044 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value"); 1045 Value x = (Value) vh.get(array, i); 1046 assertEquals(x, Value.getInstance(10), "failing compareAndExchange Value value"); 1047 } 1048 1049 { 1050 Value r = (Value) vh.compareAndExchangeAcquire(array, i, Value.getInstance(10), Value.getInstance(20)); 1051 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value"); 1052 Value x = (Value) vh.get(array, i); 1053 assertEquals(x, Value.getInstance(20), "success compareAndExchangeAcquire Value value"); 1054 } 1055 1056 { 1057 Value r = (Value) vh.compareAndExchangeAcquire(array, i, Value.getInstance(10), Value.getInstance(30)); 1058 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value"); 1059 Value x = (Value) vh.get(array, i); 1060 assertEquals(x, Value.getInstance(20), "failing compareAndExchangeAcquire Value value"); 1061 } 1062 1063 { 1064 Value r = (Value) vh.compareAndExchangeRelease(array, i, Value.getInstance(20), Value.getInstance(10)); 1065 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value"); 1066 Value x = (Value) vh.get(array, i); 1067 assertEquals(x, Value.getInstance(10), "success compareAndExchangeRelease Value value"); 1068 } 1069 1070 { 1071 Value r = (Value) vh.compareAndExchangeRelease(array, i, Value.getInstance(20), Value.getInstance(30)); 1072 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value"); 1073 Value x = (Value) vh.get(array, i); 1074 assertEquals(x, Value.getInstance(10), "failing compareAndExchangeRelease Value value"); 1075 } 1076 1077 { 1078 boolean success = false; 1079 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1080 success = vh.weakCompareAndSetPlain(array, i, Value.getInstance(10), Value.getInstance(20)); 1081 if (!success) weakDelay(); 1082 } 1083 assertEquals(success, true, "success weakCompareAndSetPlain Value"); 1084 Value x = (Value) vh.get(array, i); 1085 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetPlain Value value"); 1086 } 1087 1088 { 1089 boolean success = vh.weakCompareAndSetPlain(array, i, Value.getInstance(10), Value.getInstance(30)); 1090 assertEquals(success, false, "failing weakCompareAndSetPlain Value"); 1091 Value x = (Value) vh.get(array, i); 1092 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetPlain Value value"); 1093 } 1094 1095 { 1096 boolean success = false; 1097 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1098 success = vh.weakCompareAndSetAcquire(array, i, Value.getInstance(20), Value.getInstance(10)); 1099 if (!success) weakDelay(); 1100 } 1101 assertEquals(success, true, "success weakCompareAndSetAcquire Value"); 1102 Value x = (Value) vh.get(array, i); 1103 assertEquals(x, Value.getInstance(10), "success weakCompareAndSetAcquire Value"); 1104 } 1105 1106 { 1107 boolean success = vh.weakCompareAndSetAcquire(array, i, Value.getInstance(20), Value.getInstance(30)); 1108 assertEquals(success, false, "failing weakCompareAndSetAcquire Value"); 1109 Value x = (Value) vh.get(array, i); 1110 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSetAcquire Value value"); 1111 } 1112 1113 { 1114 boolean success = false; 1115 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1116 success = vh.weakCompareAndSetRelease(array, i, Value.getInstance(10), Value.getInstance(20)); 1117 if (!success) weakDelay(); 1118 } 1119 assertEquals(success, true, "success weakCompareAndSetRelease Value"); 1120 Value x = (Value) vh.get(array, i); 1121 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetRelease Value"); 1122 } 1123 1124 { 1125 boolean success = vh.weakCompareAndSetRelease(array, i, Value.getInstance(10), Value.getInstance(30)); 1126 assertEquals(success, false, "failing weakCompareAndSetRelease Value"); 1127 Value x = (Value) vh.get(array, i); 1128 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetRelease Value value"); 1129 } 1130 1131 { 1132 boolean success = false; 1133 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1134 success = vh.weakCompareAndSet(array, i, Value.getInstance(20), Value.getInstance(10)); 1135 if (!success) weakDelay(); 1136 } 1137 assertEquals(success, true, "success weakCompareAndSet Value"); 1138 Value x = (Value) vh.get(array, i); 1139 assertEquals(x, Value.getInstance(10), "success weakCompareAndSet Value"); 1140 } 1141 1142 { 1143 boolean success = vh.weakCompareAndSet(array, i, Value.getInstance(20), Value.getInstance(30)); 1144 assertEquals(success, false, "failing weakCompareAndSet Value"); 1145 Value x = (Value) vh.get(array, i); 1146 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSet Value value"); 1147 } 1148 1149 // Compare set and get 1150 { 1151 vh.set(array, i, Value.getInstance(10)); 1152 1153 Value o = (Value) vh.getAndSet(array, i, Value.getInstance(20)); 1154 assertEquals(o, Value.getInstance(10), "getAndSet Value"); 1155 Value x = (Value) vh.get(array, i); 1156 assertEquals(x, Value.getInstance(20), "getAndSet Value value"); 1157 } 1158 1159 { 1160 vh.set(array, i, Value.getInstance(10)); 1161 1162 Value o = (Value) vh.getAndSetAcquire(array, i, Value.getInstance(20)); 1163 assertEquals(o, Value.getInstance(10), "getAndSetAcquire Value"); 1164 Value x = (Value) vh.get(array, i); 1165 assertEquals(x, Value.getInstance(20), "getAndSetAcquire Value value"); 1166 } 1167 1168 { 1169 vh.set(array, i, Value.getInstance(10)); 1170 1171 Value o = (Value) vh.getAndSetRelease(array, i, Value.getInstance(20)); 1172 assertEquals(o, Value.getInstance(10), "getAndSetRelease Value"); 1173 Value x = (Value) vh.get(array, i); 1174 assertEquals(x, Value.getInstance(20), "getAndSetRelease Value value"); 1175 } 1176 1177 1178 } 1179 } 1180 1181 static void testArrayUnsupported(VarHandle vh) { 1182 Value[] array = new Value[10]; 1183 1184 int i = 0; 1185 1186 checkUOE(() -> { 1187 Value o = (Value) vh.getAndAdd(array, i, Value.getInstance(10)); 1188 }); 1189 1190 checkUOE(() -> { 1191 Value o = (Value) vh.getAndAddAcquire(array, i, Value.getInstance(10)); 1192 }); 1193 1194 checkUOE(() -> { 1195 Value o = (Value) vh.getAndAddRelease(array, i, Value.getInstance(10)); 1196 }); 1197 1198 checkUOE(() -> { 1199 Value o = (Value) vh.getAndBitwiseOr(array, i, Value.getInstance(10)); 1200 }); 1201 1202 checkUOE(() -> { 1203 Value o = (Value) vh.getAndBitwiseOrAcquire(array, i, Value.getInstance(10)); 1204 }); 1205 1206 checkUOE(() -> { 1207 Value o = (Value) vh.getAndBitwiseOrRelease(array, i, Value.getInstance(10)); 1208 }); 1209 1210 checkUOE(() -> { 1211 Value o = (Value) vh.getAndBitwiseAnd(array, i, Value.getInstance(10)); 1212 }); 1213 1214 checkUOE(() -> { 1215 Value o = (Value) vh.getAndBitwiseAndAcquire(array, i, Value.getInstance(10)); 1216 }); 1217 1218 checkUOE(() -> { 1219 Value o = (Value) vh.getAndBitwiseAndRelease(array, i, Value.getInstance(10)); 1220 }); 1221 1222 checkUOE(() -> { 1223 Value o = (Value) vh.getAndBitwiseXor(array, i, Value.getInstance(10)); 1224 }); 1225 1226 checkUOE(() -> { 1227 Value o = (Value) vh.getAndBitwiseXorAcquire(array, i, Value.getInstance(10)); 1228 }); 1229 1230 checkUOE(() -> { 1231 Value o = (Value) vh.getAndBitwiseXorRelease(array, i, Value.getInstance(10)); 1232 }); 1233 } 1234 1235 static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable { 1236 Value[] array = new Value[10]; 1237 1238 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 1239 final int ci = i; 1240 1241 checkAIOOBE(() -> { 1242 Value x = (Value) vh.get(array, ci); 1243 }); 1244 1245 checkAIOOBE(() -> { 1246 vh.set(array, ci, Value.getInstance(10)); 1247 }); 1248 1249 checkAIOOBE(() -> { 1250 Value x = (Value) vh.getVolatile(array, ci); 1251 }); 1252 1253 checkAIOOBE(() -> { 1254 vh.setVolatile(array, ci, Value.getInstance(10)); 1255 }); 1256 1257 checkAIOOBE(() -> { 1258 Value x = (Value) vh.getAcquire(array, ci); 1259 }); 1260 1261 checkAIOOBE(() -> { 1262 vh.setRelease(array, ci, Value.getInstance(10)); 1263 }); 1264 1265 checkAIOOBE(() -> { 1266 Value x = (Value) vh.getOpaque(array, ci); 1267 }); 1268 1269 checkAIOOBE(() -> { 1270 vh.setOpaque(array, ci, Value.getInstance(10)); 1271 }); 1272 1273 checkAIOOBE(() -> { 1274 boolean r = vh.compareAndSet(array, ci, Value.getInstance(10), Value.getInstance(20)); 1275 }); 1276 1277 checkAIOOBE(() -> { 1278 Value r = (Value) vh.compareAndExchange(array, ci, Value.getInstance(20), Value.getInstance(10)); 1279 }); 1280 1281 checkAIOOBE(() -> { 1282 Value r = (Value) vh.compareAndExchangeAcquire(array, ci, Value.getInstance(20), Value.getInstance(10)); 1283 }); 1284 1285 checkAIOOBE(() -> { 1286 Value r = (Value) vh.compareAndExchangeRelease(array, ci, Value.getInstance(20), Value.getInstance(10)); 1287 }); 1288 1289 checkAIOOBE(() -> { 1290 boolean r = vh.weakCompareAndSetPlain(array, ci, Value.getInstance(10), Value.getInstance(20)); 1291 }); 1292 1293 checkAIOOBE(() -> { 1294 boolean r = vh.weakCompareAndSet(array, ci, Value.getInstance(10), Value.getInstance(20)); 1295 }); 1296 1297 checkAIOOBE(() -> { 1298 boolean r = vh.weakCompareAndSetAcquire(array, ci, Value.getInstance(10), Value.getInstance(20)); 1299 }); 1300 1301 checkAIOOBE(() -> { 1302 boolean r = vh.weakCompareAndSetRelease(array, ci, Value.getInstance(10), Value.getInstance(20)); 1303 }); 1304 1305 checkAIOOBE(() -> { 1306 Value o = (Value) vh.getAndSet(array, ci, Value.getInstance(10)); 1307 }); 1308 1309 checkAIOOBE(() -> { 1310 Value o = (Value) vh.getAndSetAcquire(array, ci, Value.getInstance(10)); 1311 }); 1312 1313 checkAIOOBE(() -> { 1314 Value o = (Value) vh.getAndSetRelease(array, ci, Value.getInstance(10)); 1315 }); 1316 1317 1318 } 1319 } 1320 1321 static void testArrayStoreException(VarHandle vh) throws Throwable { 1322 Object[] array = new Value[10]; 1323 Arrays.fill(array, Value.getInstance(10)); 1324 Object value = new Object(); 1325 1326 // Set 1327 checkASE(() -> { 1328 vh.set(array, 0, value); 1329 }); 1330 1331 // SetVolatile 1332 checkASE(() -> { 1333 vh.setVolatile(array, 0, value); 1334 }); 1335 1336 // SetOpaque 1337 checkASE(() -> { 1338 vh.setOpaque(array, 0, value); 1339 }); 1340 1341 // SetRelease 1342 checkASE(() -> { 1343 vh.setRelease(array, 0, value); 1344 }); 1345 1346 // CompareAndSet 1347 checkASE(() -> { // receiver reference class 1348 boolean r = vh.compareAndSet(array, 0, Value.getInstance(10), value); 1349 }); 1350 1351 // WeakCompareAndSet 1352 checkASE(() -> { // receiver reference class 1353 boolean r = vh.weakCompareAndSetPlain(array, 0, Value.getInstance(10), value); 1354 }); 1355 1356 // WeakCompareAndSetVolatile 1357 checkASE(() -> { // receiver reference class 1358 boolean r = vh.weakCompareAndSet(array, 0, Value.getInstance(10), value); 1359 }); 1360 1361 // WeakCompareAndSetAcquire 1362 checkASE(() -> { // receiver reference class 1363 boolean r = vh.weakCompareAndSetAcquire(array, 0, Value.getInstance(10), value); 1364 }); 1365 1366 // WeakCompareAndSetRelease 1367 checkASE(() -> { // receiver reference class 1368 boolean r = vh.weakCompareAndSetRelease(array, 0, Value.getInstance(10), value); 1369 }); 1370 1371 // CompareAndExchange 1372 checkASE(() -> { // receiver reference class 1373 Value x = (Value) vh.compareAndExchange(array, 0, Value.getInstance(10), value); 1374 }); 1375 1376 // CompareAndExchangeAcquire 1377 checkASE(() -> { // receiver reference class 1378 Value x = (Value) vh.compareAndExchangeAcquire(array, 0, Value.getInstance(10), value); 1379 }); 1380 1381 // CompareAndExchangeRelease 1382 checkASE(() -> { // receiver reference class 1383 Value x = (Value) vh.compareAndExchangeRelease(array, 0, Value.getInstance(10), value); 1384 }); 1385 1386 // GetAndSet 1387 checkASE(() -> { // receiver reference class 1388 Value x = (Value) vh.getAndSet(array, 0, value); 1389 }); 1390 1391 // GetAndSetAcquire 1392 checkASE(() -> { // receiver reference class 1393 Value x = (Value) vh.getAndSetAcquire(array, 0, value); 1394 }); 1395 1396 // GetAndSetRelease 1397 checkASE(() -> { // receiver reference class 1398 Value x = (Value) vh.getAndSetRelease(array, 0, value); 1399 }); 1400 } 1401 } 1402