1 /* 2 * Copyright (c) 2015, 2025, 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 #warn 25 26 /* 27 * @test 28 #if[Value] 29 * @enablePreview 30 * @modules java.base/jdk.internal.vm.annotation 31 #end[Value] 32 * @run junit/othervm -Diters=10 -Xint VarHandleTestAccess$Type$ 33 * 34 * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations 35 * to hit compilation thresholds 36 * 37 * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:TieredStopAtLevel=1 VarHandleTestAccess$Type$ 38 * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 VarHandleTestAccess$Type$ 39 * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:-TieredCompilation VarHandleTestAccess$Type$ 40 */ 41 42 import java.lang.invoke.MethodHandles; 43 import java.lang.invoke.VarHandle; 44 import java.util.ArrayList; 45 import java.util.Arrays; 46 import java.util.List; 47 48 import static org.junit.jupiter.api.Assertions.*; 49 import org.junit.jupiter.api.BeforeAll; 50 import org.junit.jupiter.api.Test; 51 import org.junit.jupiter.api.TestInstance; 52 import org.junit.jupiter.params.ParameterizedTest; 53 import org.junit.jupiter.params.provider.MethodSource; 54 55 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 56 public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { 57 static final $type$ static_final_v = $value1$; 58 59 static $type$ static_v; 60 61 final $type$ final_v = $value1$; 62 63 $type$ v; 64 65 static final $type$ static_final_v2 = $value1$; 66 67 static $type$ static_v2; 68 69 final $type$ final_v2 = $value1$; 70 71 $type$ v2; 72 73 VarHandle vhFinalField; 74 75 VarHandle vhField; 76 77 VarHandle vhStaticField; 78 79 VarHandle vhStaticFinalField; 80 81 VarHandle vhArray; 82 83 #if[Object] 84 VarHandle vhArrayObject; 85 #end[Object] 86 87 VarHandle[] allocate(boolean same) { 88 List<VarHandle> vhs = new ArrayList<>(); 89 90 String postfix = same ? "" : "2"; 91 VarHandle vh; 92 try { 93 vh = MethodHandles.lookup().findVarHandle( 94 VarHandleTestAccess$Type$.class, "final_v" + postfix, $type$.class); 95 vhs.add(vh); 96 97 vh = MethodHandles.lookup().findVarHandle( 98 VarHandleTestAccess$Type$.class, "v" + postfix, $type$.class); 99 vhs.add(vh); 100 101 vh = MethodHandles.lookup().findStaticVarHandle( 102 VarHandleTestAccess$Type$.class, "static_final_v" + postfix, $type$.class); 103 vhs.add(vh); 104 105 vh = MethodHandles.lookup().findStaticVarHandle( 106 VarHandleTestAccess$Type$.class, "static_v" + postfix, $type$.class); 107 vhs.add(vh); 108 109 if (same) { 110 vh = MethodHandles.arrayElementVarHandle($type$[].class); 111 } 112 else { 113 #if[String] 114 vh = MethodHandles.arrayElementVarHandle(int[].class); 115 #else[String] 116 vh = MethodHandles.arrayElementVarHandle(String[].class); 117 #end[String] 118 } 119 vhs.add(vh); 120 } catch (Exception e) { 121 throw new InternalError(e); 122 } 123 return vhs.toArray(new VarHandle[0]); 124 } 125 126 @BeforeAll 127 public void setup() throws Exception { 128 vhFinalField = MethodHandles.lookup().findVarHandle( 129 VarHandleTestAccess$Type$.class, "final_v", $type$.class); 130 131 vhField = MethodHandles.lookup().findVarHandle( 132 VarHandleTestAccess$Type$.class, "v", $type$.class); 133 134 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle( 135 VarHandleTestAccess$Type$.class, "static_final_v", $type$.class); 136 137 vhStaticField = MethodHandles.lookup().findStaticVarHandle( 138 VarHandleTestAccess$Type$.class, "static_v", $type$.class); 139 140 vhArray = MethodHandles.arrayElementVarHandle($type$[].class); 141 #if[Object] 142 vhArrayObject = MethodHandles.arrayElementVarHandle(Object[].class); 143 #end[Object] 144 } 145 146 public Object[][] varHandlesProvider() throws Exception { 147 List<VarHandle> vhs = new ArrayList<>(); 148 vhs.add(vhField); 149 vhs.add(vhStaticField); 150 vhs.add(vhArray); 151 152 return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); 153 } 154 155 @Test 156 public void testEquals() { 157 VarHandle[] vhs1 = allocate(true); 158 VarHandle[] vhs2 = allocate(true); 159 160 for (int i = 0; i < vhs1.length; i++) { 161 for (int j = 0; j < vhs1.length; j++) { 162 if (i != j) { 163 assertNotEquals(vhs1[i], vhs1[j]); 164 assertNotEquals(vhs1[i], vhs2[j]); 165 } 166 } 167 } 168 169 VarHandle[] vhs3 = allocate(false); 170 for (int i = 0; i < vhs1.length; i++) { 171 assertNotEquals(vhs1[i], vhs3[i]); 172 } 173 } 174 175 @ParameterizedTest 176 @MethodSource("varHandlesProvider") 177 public void testIsAccessModeSupported(VarHandle vh) { 178 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); 179 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET)); 180 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE)); 181 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE)); 182 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE)); 183 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE)); 184 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE)); 185 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE)); 186 187 #if[CAS] 188 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET)); 189 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE)); 190 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); 191 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); 192 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN)); 193 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); 194 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); 195 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); 196 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); 197 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE)); 198 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE)); 199 #else[CAS] 200 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET)); 201 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE)); 202 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); 203 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); 204 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN)); 205 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); 206 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); 207 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); 208 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); 209 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE)); 210 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE)); 211 #end[CAS] 212 213 #if[AtomicAdd] 214 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); 215 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE)); 216 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE)); 217 #else[AtomicAdd] 218 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); 219 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE)); 220 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE)); 221 #end[AtomicAdd] 222 223 #if[Bitwise] 224 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR)); 225 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)); 226 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)); 227 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND)); 228 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)); 229 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)); 230 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR)); 231 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)); 232 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE)); 233 #else[Bitwise] 234 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR)); 235 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)); 236 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)); 237 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND)); 238 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)); 239 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)); 240 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR)); 241 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)); 242 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE)); 243 #end[Bitwise] 244 } 245 246 public Object[][] typesProvider() throws Exception { 247 List<Object[]> types = new ArrayList<>(); 248 types.add(new Object[] {vhField, Arrays.asList(VarHandleTestAccess$Type$.class)}); 249 types.add(new Object[] {vhStaticField, Arrays.asList()}); 250 types.add(new Object[] {vhArray, Arrays.asList($type$[].class, int.class)}); 251 252 return types.stream().toArray(Object[][]::new); 253 } 254 255 @ParameterizedTest 256 @MethodSource("typesProvider") 257 public void testTypes(VarHandle vh, List<Class<?>> pts) { 258 assertEquals($type$.class, vh.varType()); 259 260 assertEquals(pts, vh.coordinateTypes()); 261 262 testTypes(vh); 263 } 264 265 @Test 266 public void testLookupInstanceToStatic() { 267 checkIAE("Lookup of static final field to instance final field", () -> { 268 MethodHandles.lookup().findStaticVarHandle( 269 VarHandleTestAccess$Type$.class, "final_v", $type$.class); 270 }); 271 272 checkIAE("Lookup of static field to instance field", () -> { 273 MethodHandles.lookup().findStaticVarHandle( 274 VarHandleTestAccess$Type$.class, "v", $type$.class); 275 }); 276 } 277 278 @Test 279 public void testLookupStaticToInstance() { 280 checkIAE("Lookup of instance final field to static final field", () -> { 281 MethodHandles.lookup().findVarHandle( 282 VarHandleTestAccess$Type$.class, "static_final_v", $type$.class); 283 }); 284 285 checkIAE("Lookup of instance field to static field", () -> { 286 vhStaticField = MethodHandles.lookup().findVarHandle( 287 VarHandleTestAccess$Type$.class, "static_v", $type$.class); 288 }); 289 } 290 291 public Object[][] accessTestCaseProvider() throws Exception { 292 List<AccessTestCase<?>> cases = new ArrayList<>(); 293 294 cases.add(new VarHandleAccessTestCase("Instance final field", 295 vhFinalField, vh -> testInstanceFinalField(this, vh))); 296 cases.add(new VarHandleAccessTestCase("Instance final field unsupported", 297 vhFinalField, vh -> testInstanceFinalFieldUnsupported(this, vh), 298 false)); 299 300 cases.add(new VarHandleAccessTestCase("Static final field", 301 vhStaticFinalField, VarHandleTestAccess$Type$::testStaticFinalField)); 302 cases.add(new VarHandleAccessTestCase("Static final field unsupported", 303 vhStaticFinalField, VarHandleTestAccess$Type$::testStaticFinalFieldUnsupported, 304 false)); 305 306 cases.add(new VarHandleAccessTestCase("Instance field", 307 vhField, vh -> testInstanceField(this, vh))); 308 cases.add(new VarHandleAccessTestCase("Instance field unsupported", 309 vhField, vh -> testInstanceFieldUnsupported(this, vh), 310 false)); 311 312 cases.add(new VarHandleAccessTestCase("Static field", 313 vhStaticField, VarHandleTestAccess$Type$::testStaticField)); 314 cases.add(new VarHandleAccessTestCase("Static field unsupported", 315 vhStaticField, VarHandleTestAccess$Type$::testStaticFieldUnsupported, 316 false)); 317 318 cases.add(new VarHandleAccessTestCase("Array", 319 vhArray, VarHandleTestAccess$Type$::testArray)); 320 #if[Object] 321 cases.add(new VarHandleAccessTestCase("Array Object[]", 322 vhArrayObject, VarHandleTestAccess$Type$::testArray)); 323 #end[Object] 324 cases.add(new VarHandleAccessTestCase("Array unsupported", 325 vhArray, VarHandleTestAccess$Type$::testArrayUnsupported, 326 false)); 327 cases.add(new VarHandleAccessTestCase("Array index out of bounds", 328 vhArray, VarHandleTestAccess$Type$::testArrayIndexOutOfBounds, 329 false)); 330 #if[Object] 331 cases.add(new VarHandleAccessTestCase("Array store exception", 332 vhArrayObject, VarHandleTestAccess$Type$::testArrayStoreException, 333 false)); 334 #end[Object] 335 // Work around issue with jtreg summary reporting which truncates 336 // the String result of Object.toString to 30 characters, hence 337 // the first dummy argument 338 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new); 339 } 340 341 @ParameterizedTest 342 @MethodSource("accessTestCaseProvider") 343 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 344 T t = atc.get(); 345 int iters = atc.requiresLoop() ? ITERS : 1; 346 for (int c = 0; c < iters; c++) { 347 atc.testAccess(t); 348 } 349 } 350 351 static void testInstanceFinalField(VarHandleTestAccess$Type$ recv, VarHandle vh) { 352 // Plain 353 { 354 $type$ x = ($type$) vh.get(recv); 355 assertEquals($value1$, x, "get $type$ value"); 356 } 357 358 359 // Volatile 360 { 361 $type$ x = ($type$) vh.getVolatile(recv); 362 assertEquals($value1$, x, "getVolatile $type$ value"); 363 } 364 365 // Lazy 366 { 367 $type$ x = ($type$) vh.getAcquire(recv); 368 assertEquals($value1$, x, "getRelease $type$ value"); 369 } 370 371 // Opaque 372 { 373 $type$ x = ($type$) vh.getOpaque(recv); 374 assertEquals($value1$, x, "getOpaque $type$ value"); 375 } 376 } 377 378 static void testInstanceFinalFieldUnsupported(VarHandleTestAccess$Type$ recv, VarHandle vh) { 379 checkUOE(() -> { 380 vh.set(recv, $value2$); 381 }); 382 383 checkUOE(() -> { 384 vh.setVolatile(recv, $value2$); 385 }); 386 387 checkUOE(() -> { 388 vh.setRelease(recv, $value2$); 389 }); 390 391 checkUOE(() -> { 392 vh.setOpaque(recv, $value2$); 393 }); 394 395 #if[!CAS] 396 checkUOE(() -> { 397 boolean r = vh.compareAndSet(recv, $value1$, $value2$); 398 }); 399 400 checkUOE(() -> { 401 $type$ r = ($type$) vh.compareAndExchange(recv, $value1$, $value2$); 402 }); 403 404 checkUOE(() -> { 405 $type$ r = ($type$) vh.compareAndExchangeAcquire(recv, $value1$, $value2$); 406 }); 407 408 checkUOE(() -> { 409 $type$ r = ($type$) vh.compareAndExchangeRelease(recv, $value1$, $value2$); 410 }); 411 412 checkUOE(() -> { 413 boolean r = vh.weakCompareAndSetPlain(recv, $value1$, $value2$); 414 }); 415 416 checkUOE(() -> { 417 boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$); 418 }); 419 420 checkUOE(() -> { 421 boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$); 422 }); 423 424 checkUOE(() -> { 425 boolean r = vh.weakCompareAndSetRelease(recv, $value1$, $value2$); 426 }); 427 428 checkUOE(() -> { 429 $type$ r = ($type$) vh.getAndSet(recv, $value1$); 430 }); 431 432 checkUOE(() -> { 433 $type$ r = ($type$) vh.getAndSetAcquire(recv, $value1$); 434 }); 435 436 checkUOE(() -> { 437 $type$ r = ($type$) vh.getAndSetRelease(recv, $value1$); 438 }); 439 #end[CAS] 440 441 #if[!AtomicAdd] 442 checkUOE(() -> { 443 $type$ o = ($type$) vh.getAndAdd(recv, $value1$); 444 }); 445 446 checkUOE(() -> { 447 $type$ o = ($type$) vh.getAndAddAcquire(recv, $value1$); 448 }); 449 450 checkUOE(() -> { 451 $type$ o = ($type$) vh.getAndAddRelease(recv, $value1$); 452 }); 453 #end[AtomicAdd] 454 455 #if[!Bitwise] 456 checkUOE(() -> { 457 $type$ o = ($type$) vh.getAndBitwiseOr(recv, $value1$); 458 }); 459 460 checkUOE(() -> { 461 $type$ o = ($type$) vh.getAndBitwiseOrAcquire(recv, $value1$); 462 }); 463 464 checkUOE(() -> { 465 $type$ o = ($type$) vh.getAndBitwiseOrRelease(recv, $value1$); 466 }); 467 468 checkUOE(() -> { 469 $type$ o = ($type$) vh.getAndBitwiseAnd(recv, $value1$); 470 }); 471 472 checkUOE(() -> { 473 $type$ o = ($type$) vh.getAndBitwiseAndAcquire(recv, $value1$); 474 }); 475 476 checkUOE(() -> { 477 $type$ o = ($type$) vh.getAndBitwiseAndRelease(recv, $value1$); 478 }); 479 480 checkUOE(() -> { 481 $type$ o = ($type$) vh.getAndBitwiseXor(recv, $value1$); 482 }); 483 484 checkUOE(() -> { 485 $type$ o = ($type$) vh.getAndBitwiseXorAcquire(recv, $value1$); 486 }); 487 488 checkUOE(() -> { 489 $type$ o = ($type$) vh.getAndBitwiseXorRelease(recv, $value1$); 490 }); 491 #end[Bitwise] 492 } 493 494 495 static void testStaticFinalField(VarHandle vh) { 496 // Plain 497 { 498 $type$ x = ($type$) vh.get(); 499 assertEquals($value1$, x, "get $type$ value"); 500 } 501 502 503 // Volatile 504 { 505 $type$ x = ($type$) vh.getVolatile(); 506 assertEquals($value1$, x, "getVolatile $type$ value"); 507 } 508 509 // Lazy 510 { 511 $type$ x = ($type$) vh.getAcquire(); 512 assertEquals($value1$, x, "getRelease $type$ value"); 513 } 514 515 // Opaque 516 { 517 $type$ x = ($type$) vh.getOpaque(); 518 assertEquals($value1$, x, "getOpaque $type$ value"); 519 } 520 } 521 522 static void testStaticFinalFieldUnsupported(VarHandle vh) { 523 checkUOE(() -> { 524 vh.set($value2$); 525 }); 526 527 checkUOE(() -> { 528 vh.setVolatile($value2$); 529 }); 530 531 checkUOE(() -> { 532 vh.setRelease($value2$); 533 }); 534 535 checkUOE(() -> { 536 vh.setOpaque($value2$); 537 }); 538 539 #if[!CAS] 540 checkUOE(() -> { 541 boolean r = vh.compareAndSet($value1$, $value2$); 542 }); 543 544 checkUOE(() -> { 545 $type$ r = ($type$) vh.compareAndExchange($value1$, $value2$); 546 }); 547 548 checkUOE(() -> { 549 $type$ r = ($type$) vh.compareAndExchangeAcquire($value1$, $value2$); 550 }); 551 552 checkUOE(() -> { 553 $type$ r = ($type$) vh.compareAndExchangeRelease($value1$, $value2$); 554 }); 555 556 checkUOE(() -> { 557 boolean r = vh.weakCompareAndSetPlain($value1$, $value2$); 558 }); 559 560 checkUOE(() -> { 561 boolean r = vh.weakCompareAndSet($value1$, $value2$); 562 }); 563 564 checkUOE(() -> { 565 boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$); 566 }); 567 568 checkUOE(() -> { 569 boolean r = vh.weakCompareAndSetRelease($value1$, $value2$); 570 }); 571 572 checkUOE(() -> { 573 $type$ r = ($type$) vh.getAndSet($value1$); 574 }); 575 576 checkUOE(() -> { 577 $type$ r = ($type$) vh.getAndSetAcquire($value1$); 578 }); 579 580 checkUOE(() -> { 581 $type$ r = ($type$) vh.getAndSetRelease($value1$); 582 }); 583 #end[CAS] 584 585 #if[!AtomicAdd] 586 checkUOE(() -> { 587 $type$ o = ($type$) vh.getAndAdd($value1$); 588 }); 589 590 checkUOE(() -> { 591 $type$ o = ($type$) vh.getAndAddAcquire($value1$); 592 }); 593 594 checkUOE(() -> { 595 $type$ o = ($type$) vh.getAndAddRelease($value1$); 596 }); 597 #end[AtomicAdd] 598 599 #if[!Bitwise] 600 checkUOE(() -> { 601 $type$ o = ($type$) vh.getAndBitwiseOr($value1$); 602 }); 603 604 checkUOE(() -> { 605 $type$ o = ($type$) vh.getAndBitwiseOrAcquire($value1$); 606 }); 607 608 checkUOE(() -> { 609 $type$ o = ($type$) vh.getAndBitwiseOrRelease($value1$); 610 }); 611 612 checkUOE(() -> { 613 $type$ o = ($type$) vh.getAndBitwiseAnd($value1$); 614 }); 615 616 checkUOE(() -> { 617 $type$ o = ($type$) vh.getAndBitwiseAndAcquire($value1$); 618 }); 619 620 checkUOE(() -> { 621 $type$ o = ($type$) vh.getAndBitwiseAndRelease($value1$); 622 }); 623 624 checkUOE(() -> { 625 $type$ o = ($type$) vh.getAndBitwiseXor($value1$); 626 }); 627 628 checkUOE(() -> { 629 $type$ o = ($type$) vh.getAndBitwiseXorAcquire($value1$); 630 }); 631 632 checkUOE(() -> { 633 $type$ o = ($type$) vh.getAndBitwiseXorRelease($value1$); 634 }); 635 #end[Bitwise] 636 } 637 638 639 static void testInstanceField(VarHandleTestAccess$Type$ recv, VarHandle vh) { 640 // Plain 641 { 642 vh.set(recv, $value1$); 643 $type$ x = ($type$) vh.get(recv); 644 assertEquals($value1$, x, "set $type$ value"); 645 } 646 647 648 // Volatile 649 { 650 vh.setVolatile(recv, $value2$); 651 $type$ x = ($type$) vh.getVolatile(recv); 652 assertEquals($value2$, x, "setVolatile $type$ value"); 653 } 654 655 // Lazy 656 { 657 vh.setRelease(recv, $value1$); 658 $type$ x = ($type$) vh.getAcquire(recv); 659 assertEquals($value1$, x, "setRelease $type$ value"); 660 } 661 662 // Opaque 663 { 664 vh.setOpaque(recv, $value2$); 665 $type$ x = ($type$) vh.getOpaque(recv); 666 assertEquals($value2$, x, "setOpaque $type$ value"); 667 } 668 669 #if[CAS] 670 vh.set(recv, $value1$); 671 672 // Compare 673 { 674 boolean r = vh.compareAndSet(recv, $value1$, $value2$); 675 assertEquals(r, true, "success compareAndSet $type$"); 676 $type$ x = ($type$) vh.get(recv); 677 assertEquals($value2$, x, "success compareAndSet $type$ value"); 678 } 679 680 { 681 boolean r = vh.compareAndSet(recv, $value1$, $value3$); 682 assertEquals(r, false, "failing compareAndSet $type$"); 683 $type$ x = ($type$) vh.get(recv); 684 assertEquals($value2$, x, "failing compareAndSet $type$ value"); 685 } 686 687 { 688 $type$ r = ($type$) vh.compareAndExchange(recv, $value2$, $value1$); 689 assertEquals(r, $value2$, "success compareAndExchange $type$"); 690 $type$ x = ($type$) vh.get(recv); 691 assertEquals($value1$, x, "success compareAndExchange $type$ value"); 692 } 693 694 { 695 $type$ r = ($type$) vh.compareAndExchange(recv, $value2$, $value3$); 696 assertEquals(r, $value1$, "failing compareAndExchange $type$"); 697 $type$ x = ($type$) vh.get(recv); 698 assertEquals($value1$, x, "failing compareAndExchange $type$ value"); 699 } 700 701 { 702 $type$ r = ($type$) vh.compareAndExchangeAcquire(recv, $value1$, $value2$); 703 assertEquals(r, $value1$, "success compareAndExchangeAcquire $type$"); 704 $type$ x = ($type$) vh.get(recv); 705 assertEquals($value2$, x, "success compareAndExchangeAcquire $type$ value"); 706 } 707 708 { 709 $type$ r = ($type$) vh.compareAndExchangeAcquire(recv, $value1$, $value3$); 710 assertEquals(r, $value2$, "failing compareAndExchangeAcquire $type$"); 711 $type$ x = ($type$) vh.get(recv); 712 assertEquals($value2$, x, "failing compareAndExchangeAcquire $type$ value"); 713 } 714 715 { 716 $type$ r = ($type$) vh.compareAndExchangeRelease(recv, $value2$, $value1$); 717 assertEquals(r, $value2$, "success compareAndExchangeRelease $type$"); 718 $type$ x = ($type$) vh.get(recv); 719 assertEquals($value1$, x, "success compareAndExchangeRelease $type$ value"); 720 } 721 722 { 723 $type$ r = ($type$) vh.compareAndExchangeRelease(recv, $value2$, $value3$); 724 assertEquals(r, $value1$, "failing compareAndExchangeRelease $type$"); 725 $type$ x = ($type$) vh.get(recv); 726 assertEquals($value1$, x, "failing compareAndExchangeRelease $type$ value"); 727 } 728 729 { 730 boolean success = false; 731 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 732 success = vh.weakCompareAndSetPlain(recv, $value1$, $value2$); 733 if (!success) weakDelay(); 734 } 735 assertEquals(success, true, "success weakCompareAndSetPlain $type$"); 736 $type$ x = ($type$) vh.get(recv); 737 assertEquals($value2$, x, "success weakCompareAndSetPlain $type$ value"); 738 } 739 740 { 741 boolean success = vh.weakCompareAndSetPlain(recv, $value1$, $value3$); 742 assertEquals(success, false, "failing weakCompareAndSetPlain $type$"); 743 $type$ x = ($type$) vh.get(recv); 744 assertEquals($value2$, x, "failing weakCompareAndSetPlain $type$ value"); 745 } 746 747 { 748 boolean success = false; 749 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 750 success = vh.weakCompareAndSetAcquire(recv, $value2$, $value1$); 751 if (!success) weakDelay(); 752 } 753 assertEquals(success, true, "success weakCompareAndSetAcquire $type$"); 754 $type$ x = ($type$) vh.get(recv); 755 assertEquals($value1$, x, "success weakCompareAndSetAcquire $type$"); 756 } 757 758 { 759 boolean success = vh.weakCompareAndSetAcquire(recv, $value2$, $value3$); 760 assertEquals(success, false, "failing weakCompareAndSetAcquire $type$"); 761 $type$ x = ($type$) vh.get(recv); 762 assertEquals($value1$, x, "failing weakCompareAndSetAcquire $type$ value"); 763 } 764 765 { 766 boolean success = false; 767 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 768 success = vh.weakCompareAndSetRelease(recv, $value1$, $value2$); 769 if (!success) weakDelay(); 770 } 771 assertEquals(success, true, "success weakCompareAndSetRelease $type$"); 772 $type$ x = ($type$) vh.get(recv); 773 assertEquals($value2$, x, "success weakCompareAndSetRelease $type$"); 774 } 775 776 { 777 boolean success = vh.weakCompareAndSetRelease(recv, $value1$, $value3$); 778 assertEquals(success, false, "failing weakCompareAndSetRelease $type$"); 779 $type$ x = ($type$) vh.get(recv); 780 assertEquals($value2$, x, "failing weakCompareAndSetRelease $type$ value"); 781 } 782 783 { 784 boolean success = false; 785 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 786 success = vh.weakCompareAndSet(recv, $value2$, $value1$); 787 if (!success) weakDelay(); 788 } 789 assertEquals(success, true, "success weakCompareAndSet $type$"); 790 $type$ x = ($type$) vh.get(recv); 791 assertEquals($value1$, x, "success weakCompareAndSet $type$ value"); 792 } 793 794 { 795 boolean success = vh.weakCompareAndSet(recv, $value2$, $value3$); 796 assertEquals(success, false, "failing weakCompareAndSet $type$"); 797 $type$ x = ($type$) vh.get(recv); 798 assertEquals($value1$, x, "failing weakCompareAndSet $type$ value"); 799 } 800 801 // Compare set and get 802 { 803 vh.set(recv, $value1$); 804 805 $type$ o = ($type$) vh.getAndSet(recv, $value2$); 806 assertEquals($value1$, o, "getAndSet $type$"); 807 $type$ x = ($type$) vh.get(recv); 808 assertEquals($value2$, x, "getAndSet $type$ value"); 809 } 810 811 { 812 vh.set(recv, $value1$); 813 814 $type$ o = ($type$) vh.getAndSetAcquire(recv, $value2$); 815 assertEquals($value1$, o, "getAndSetAcquire $type$"); 816 $type$ x = ($type$) vh.get(recv); 817 assertEquals($value2$, x, "getAndSetAcquire $type$ value"); 818 } 819 820 { 821 vh.set(recv, $value1$); 822 823 $type$ o = ($type$) vh.getAndSetRelease(recv, $value2$); 824 assertEquals($value1$, o, "getAndSetRelease $type$"); 825 $type$ x = ($type$) vh.get(recv); 826 assertEquals($value2$, x, "getAndSetRelease $type$ value"); 827 } 828 #end[CAS] 829 830 #if[AtomicAdd] 831 // get and add, add and get 832 { 833 vh.set(recv, $value1$); 834 835 $type$ o = ($type$) vh.getAndAdd(recv, $value2$); 836 assertEquals($value1$, o, "getAndAdd $type$"); 837 $type$ x = ($type$) vh.get(recv); 838 assertEquals(($type$)($value1$ + $value2$), x, "getAndAdd $type$ value"); 839 } 840 841 { 842 vh.set(recv, $value1$); 843 844 $type$ o = ($type$) vh.getAndAddAcquire(recv, $value2$); 845 assertEquals($value1$, o, "getAndAddAcquire $type$"); 846 $type$ x = ($type$) vh.get(recv); 847 assertEquals(($type$)($value1$ + $value2$), x, "getAndAddAcquire $type$ value"); 848 } 849 850 { 851 vh.set(recv, $value1$); 852 853 $type$ o = ($type$) vh.getAndAddRelease(recv, $value2$); 854 assertEquals($value1$, o, "getAndAddRelease$type$"); 855 $type$ x = ($type$) vh.get(recv); 856 assertEquals(($type$)($value1$ + $value2$), x, "getAndAddRelease $type$ value"); 857 } 858 #end[AtomicAdd] 859 860 #if[Bitwise] 861 // get and bitwise or 862 { 863 vh.set(recv, $value1$); 864 865 $type$ o = ($type$) vh.getAndBitwiseOr(recv, $value2$); 866 assertEquals($value1$, o, "getAndBitwiseOr $type$"); 867 $type$ x = ($type$) vh.get(recv); 868 assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOr $type$ value"); 869 } 870 871 { 872 vh.set(recv, $value1$); 873 874 $type$ o = ($type$) vh.getAndBitwiseOrAcquire(recv, $value2$); 875 assertEquals($value1$, o, "getAndBitwiseOrAcquire $type$"); 876 $type$ x = ($type$) vh.get(recv); 877 assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrAcquire $type$ value"); 878 } 879 880 { 881 vh.set(recv, $value1$); 882 883 $type$ o = ($type$) vh.getAndBitwiseOrRelease(recv, $value2$); 884 assertEquals($value1$, o, "getAndBitwiseOrRelease $type$"); 885 $type$ x = ($type$) vh.get(recv); 886 assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrRelease $type$ value"); 887 } 888 889 // get and bitwise and 890 { 891 vh.set(recv, $value1$); 892 893 $type$ o = ($type$) vh.getAndBitwiseAnd(recv, $value2$); 894 assertEquals($value1$, o, "getAndBitwiseAnd $type$"); 895 $type$ x = ($type$) vh.get(recv); 896 assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAnd $type$ value"); 897 } 898 899 { 900 vh.set(recv, $value1$); 901 902 $type$ o = ($type$) vh.getAndBitwiseAndAcquire(recv, $value2$); 903 assertEquals($value1$, o, "getAndBitwiseAndAcquire $type$"); 904 $type$ x = ($type$) vh.get(recv); 905 assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndAcquire $type$ value"); 906 } 907 908 { 909 vh.set(recv, $value1$); 910 911 $type$ o = ($type$) vh.getAndBitwiseAndRelease(recv, $value2$); 912 assertEquals($value1$, o, "getAndBitwiseAndRelease $type$"); 913 $type$ x = ($type$) vh.get(recv); 914 assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndRelease $type$ value"); 915 } 916 917 // get and bitwise xor 918 { 919 vh.set(recv, $value1$); 920 921 $type$ o = ($type$) vh.getAndBitwiseXor(recv, $value2$); 922 assertEquals($value1$, o, "getAndBitwiseXor $type$"); 923 $type$ x = ($type$) vh.get(recv); 924 assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXor $type$ value"); 925 } 926 927 { 928 vh.set(recv, $value1$); 929 930 $type$ o = ($type$) vh.getAndBitwiseXorAcquire(recv, $value2$); 931 assertEquals($value1$, o, "getAndBitwiseXorAcquire $type$"); 932 $type$ x = ($type$) vh.get(recv); 933 assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorAcquire $type$ value"); 934 } 935 936 { 937 vh.set(recv, $value1$); 938 939 $type$ o = ($type$) vh.getAndBitwiseXorRelease(recv, $value2$); 940 assertEquals($value1$, o, "getAndBitwiseXorRelease $type$"); 941 $type$ x = ($type$) vh.get(recv); 942 assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorRelease $type$ value"); 943 } 944 #end[Bitwise] 945 } 946 947 static void testInstanceFieldUnsupported(VarHandleTestAccess$Type$ recv, VarHandle vh) { 948 #if[!CAS] 949 checkUOE(() -> { 950 boolean r = vh.compareAndSet(recv, $value1$, $value2$); 951 }); 952 953 checkUOE(() -> { 954 $type$ r = ($type$) vh.compareAndExchange(recv, $value1$, $value2$); 955 }); 956 957 checkUOE(() -> { 958 $type$ r = ($type$) vh.compareAndExchangeAcquire(recv, $value1$, $value2$); 959 }); 960 961 checkUOE(() -> { 962 $type$ r = ($type$) vh.compareAndExchangeRelease(recv, $value1$, $value2$); 963 }); 964 965 checkUOE(() -> { 966 boolean r = vh.weakCompareAndSetPlain(recv, $value1$, $value2$); 967 }); 968 969 checkUOE(() -> { 970 boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$); 971 }); 972 973 checkUOE(() -> { 974 boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$); 975 }); 976 977 checkUOE(() -> { 978 boolean r = vh.weakCompareAndSetRelease(recv, $value1$, $value2$); 979 }); 980 981 checkUOE(() -> { 982 $type$ r = ($type$) vh.getAndSet(recv, $value1$); 983 }); 984 985 checkUOE(() -> { 986 $type$ r = ($type$) vh.getAndSetAcquire(recv, $value1$); 987 }); 988 989 checkUOE(() -> { 990 $type$ r = ($type$) vh.getAndSetRelease(recv, $value1$); 991 }); 992 #end[CAS] 993 994 #if[!AtomicAdd] 995 checkUOE(() -> { 996 $type$ o = ($type$) vh.getAndAdd(recv, $value1$); 997 }); 998 999 checkUOE(() -> { 1000 $type$ o = ($type$) vh.getAndAddAcquire(recv, $value1$); 1001 }); 1002 1003 checkUOE(() -> { 1004 $type$ o = ($type$) vh.getAndAddRelease(recv, $value1$); 1005 }); 1006 #end[AtomicAdd] 1007 1008 #if[!Bitwise] 1009 checkUOE(() -> { 1010 $type$ o = ($type$) vh.getAndBitwiseOr(recv, $value1$); 1011 }); 1012 1013 checkUOE(() -> { 1014 $type$ o = ($type$) vh.getAndBitwiseOrAcquire(recv, $value1$); 1015 }); 1016 1017 checkUOE(() -> { 1018 $type$ o = ($type$) vh.getAndBitwiseOrRelease(recv, $value1$); 1019 }); 1020 1021 checkUOE(() -> { 1022 $type$ o = ($type$) vh.getAndBitwiseAnd(recv, $value1$); 1023 }); 1024 1025 checkUOE(() -> { 1026 $type$ o = ($type$) vh.getAndBitwiseAndAcquire(recv, $value1$); 1027 }); 1028 1029 checkUOE(() -> { 1030 $type$ o = ($type$) vh.getAndBitwiseAndRelease(recv, $value1$); 1031 }); 1032 1033 checkUOE(() -> { 1034 $type$ o = ($type$) vh.getAndBitwiseXor(recv, $value1$); 1035 }); 1036 1037 checkUOE(() -> { 1038 $type$ o = ($type$) vh.getAndBitwiseXorAcquire(recv, $value1$); 1039 }); 1040 1041 checkUOE(() -> { 1042 $type$ o = ($type$) vh.getAndBitwiseXorRelease(recv, $value1$); 1043 }); 1044 #end[Bitwise] 1045 } 1046 1047 1048 static void testStaticField(VarHandle vh) { 1049 // Plain 1050 { 1051 vh.set($value1$); 1052 $type$ x = ($type$) vh.get(); 1053 assertEquals($value1$, x, "set $type$ value"); 1054 } 1055 1056 1057 // Volatile 1058 { 1059 vh.setVolatile($value2$); 1060 $type$ x = ($type$) vh.getVolatile(); 1061 assertEquals($value2$, x, "setVolatile $type$ value"); 1062 } 1063 1064 // Lazy 1065 { 1066 vh.setRelease($value1$); 1067 $type$ x = ($type$) vh.getAcquire(); 1068 assertEquals($value1$, x, "setRelease $type$ value"); 1069 } 1070 1071 // Opaque 1072 { 1073 vh.setOpaque($value2$); 1074 $type$ x = ($type$) vh.getOpaque(); 1075 assertEquals($value2$, x, "setOpaque $type$ value"); 1076 } 1077 1078 #if[CAS] 1079 vh.set($value1$); 1080 1081 // Compare 1082 { 1083 boolean r = vh.compareAndSet($value1$, $value2$); 1084 assertEquals(r, true, "success compareAndSet $type$"); 1085 $type$ x = ($type$) vh.get(); 1086 assertEquals($value2$, x, "success compareAndSet $type$ value"); 1087 } 1088 1089 { 1090 boolean r = vh.compareAndSet($value1$, $value3$); 1091 assertEquals(r, false, "failing compareAndSet $type$"); 1092 $type$ x = ($type$) vh.get(); 1093 assertEquals($value2$, x, "failing compareAndSet $type$ value"); 1094 } 1095 1096 { 1097 $type$ r = ($type$) vh.compareAndExchange($value2$, $value1$); 1098 assertEquals(r, $value2$, "success compareAndExchange $type$"); 1099 $type$ x = ($type$) vh.get(); 1100 assertEquals($value1$, x, "success compareAndExchange $type$ value"); 1101 } 1102 1103 { 1104 $type$ r = ($type$) vh.compareAndExchange($value2$, $value3$); 1105 assertEquals(r, $value1$, "failing compareAndExchange $type$"); 1106 $type$ x = ($type$) vh.get(); 1107 assertEquals($value1$, x, "failing compareAndExchange $type$ value"); 1108 } 1109 1110 { 1111 $type$ r = ($type$) vh.compareAndExchangeAcquire($value1$, $value2$); 1112 assertEquals(r, $value1$, "success compareAndExchangeAcquire $type$"); 1113 $type$ x = ($type$) vh.get(); 1114 assertEquals($value2$, x, "success compareAndExchangeAcquire $type$ value"); 1115 } 1116 1117 { 1118 $type$ r = ($type$) vh.compareAndExchangeAcquire($value1$, $value3$); 1119 assertEquals(r, $value2$, "failing compareAndExchangeAcquire $type$"); 1120 $type$ x = ($type$) vh.get(); 1121 assertEquals($value2$, x, "failing compareAndExchangeAcquire $type$ value"); 1122 } 1123 1124 { 1125 $type$ r = ($type$) vh.compareAndExchangeRelease($value2$, $value1$); 1126 assertEquals(r, $value2$, "success compareAndExchangeRelease $type$"); 1127 $type$ x = ($type$) vh.get(); 1128 assertEquals($value1$, x, "success compareAndExchangeRelease $type$ value"); 1129 } 1130 1131 { 1132 $type$ r = ($type$) vh.compareAndExchangeRelease($value2$, $value3$); 1133 assertEquals(r, $value1$, "failing compareAndExchangeRelease $type$"); 1134 $type$ x = ($type$) vh.get(); 1135 assertEquals($value1$, x, "failing compareAndExchangeRelease $type$ value"); 1136 } 1137 1138 { 1139 boolean success = false; 1140 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1141 success = vh.weakCompareAndSetPlain($value1$, $value2$); 1142 if (!success) weakDelay(); 1143 } 1144 assertEquals(success, true, "success weakCompareAndSetPlain $type$"); 1145 $type$ x = ($type$) vh.get(); 1146 assertEquals($value2$, x, "success weakCompareAndSetPlain $type$ value"); 1147 } 1148 1149 { 1150 boolean success = vh.weakCompareAndSetPlain($value1$, $value3$); 1151 assertEquals(success, false, "failing weakCompareAndSetPlain $type$"); 1152 $type$ x = ($type$) vh.get(); 1153 assertEquals($value2$, x, "failing weakCompareAndSetPlain $type$ value"); 1154 } 1155 1156 { 1157 boolean success = false; 1158 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1159 success = vh.weakCompareAndSetAcquire($value2$, $value1$); 1160 if (!success) weakDelay(); 1161 } 1162 assertEquals(success, true, "success weakCompareAndSetAcquire $type$"); 1163 $type$ x = ($type$) vh.get(); 1164 assertEquals($value1$, x, "success weakCompareAndSetAcquire $type$"); 1165 } 1166 1167 { 1168 boolean success = vh.weakCompareAndSetAcquire($value2$, $value3$); 1169 assertEquals(success, false, "failing weakCompareAndSetAcquire $type$"); 1170 $type$ x = ($type$) vh.get(); 1171 assertEquals($value1$, x, "failing weakCompareAndSetAcquire $type$ value"); 1172 } 1173 1174 { 1175 boolean success = false; 1176 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1177 success = vh.weakCompareAndSetRelease($value1$, $value2$); 1178 if (!success) weakDelay(); 1179 } 1180 assertEquals(success, true, "success weakCompareAndSetRelease $type$"); 1181 $type$ x = ($type$) vh.get(); 1182 assertEquals($value2$, x, "success weakCompareAndSetRelease $type$"); 1183 } 1184 1185 { 1186 boolean success = vh.weakCompareAndSetRelease($value1$, $value3$); 1187 assertEquals(success, false, "failing weakCompareAndSetRelease $type$"); 1188 $type$ x = ($type$) vh.get(); 1189 assertEquals($value2$, x, "failing weakCompareAndSetRelease $type$ value"); 1190 } 1191 1192 { 1193 boolean success = false; 1194 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1195 success = vh.weakCompareAndSet($value2$, $value1$); 1196 if (!success) weakDelay(); 1197 } 1198 assertEquals(success, true, "success weakCompareAndSet $type$"); 1199 $type$ x = ($type$) vh.get(); 1200 assertEquals($value1$, x, "success weakCompareAndSet $type$"); 1201 } 1202 1203 { 1204 boolean success = vh.weakCompareAndSet($value2$, $value3$); 1205 assertEquals(success, false, "failing weakCompareAndSet $type$"); 1206 $type$ x = ($type$) vh.get(); 1207 assertEquals($value1$, x, "failing weakCompareAndSet $type$ value"); 1208 } 1209 1210 // Compare set and get 1211 { 1212 vh.set($value1$); 1213 1214 $type$ o = ($type$) vh.getAndSet($value2$); 1215 assertEquals($value1$, o, "getAndSet $type$"); 1216 $type$ x = ($type$) vh.get(); 1217 assertEquals($value2$, x, "getAndSet $type$ value"); 1218 } 1219 1220 { 1221 vh.set($value1$); 1222 1223 $type$ o = ($type$) vh.getAndSetAcquire($value2$); 1224 assertEquals($value1$, o, "getAndSetAcquire $type$"); 1225 $type$ x = ($type$) vh.get(); 1226 assertEquals($value2$, x, "getAndSetAcquire $type$ value"); 1227 } 1228 1229 { 1230 vh.set($value1$); 1231 1232 $type$ o = ($type$) vh.getAndSetRelease($value2$); 1233 assertEquals($value1$, o, "getAndSetRelease $type$"); 1234 $type$ x = ($type$) vh.get(); 1235 assertEquals($value2$, x, "getAndSetRelease $type$ value"); 1236 } 1237 #end[CAS] 1238 1239 #if[AtomicAdd] 1240 // get and add, add and get 1241 { 1242 vh.set($value1$); 1243 1244 $type$ o = ($type$) vh.getAndAdd($value2$); 1245 assertEquals($value1$, o, "getAndAdd $type$"); 1246 $type$ x = ($type$) vh.get(); 1247 assertEquals(($type$)($value1$ + $value2$), x, "getAndAdd $type$ value"); 1248 } 1249 1250 { 1251 vh.set($value1$); 1252 1253 $type$ o = ($type$) vh.getAndAddAcquire($value2$); 1254 assertEquals($value1$, o, "getAndAddAcquire $type$"); 1255 $type$ x = ($type$) vh.get(); 1256 assertEquals(($type$)($value1$ + $value2$), x, "getAndAddAcquire $type$ value"); 1257 } 1258 1259 { 1260 vh.set($value1$); 1261 1262 $type$ o = ($type$) vh.getAndAddRelease($value2$); 1263 assertEquals($value1$, o, "getAndAddRelease$type$"); 1264 $type$ x = ($type$) vh.get(); 1265 assertEquals(($type$)($value1$ + $value2$), x, "getAndAddRelease $type$ value"); 1266 } 1267 #end[AtomicAdd] 1268 1269 #if[Bitwise] 1270 // get and bitwise or 1271 { 1272 vh.set($value1$); 1273 1274 $type$ o = ($type$) vh.getAndBitwiseOr($value2$); 1275 assertEquals($value1$, o, "getAndBitwiseOr $type$"); 1276 $type$ x = ($type$) vh.get(); 1277 assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOr $type$ value"); 1278 } 1279 1280 { 1281 vh.set($value1$); 1282 1283 $type$ o = ($type$) vh.getAndBitwiseOrAcquire($value2$); 1284 assertEquals($value1$, o, "getAndBitwiseOrAcquire $type$"); 1285 $type$ x = ($type$) vh.get(); 1286 assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrAcquire $type$ value"); 1287 } 1288 1289 { 1290 vh.set($value1$); 1291 1292 $type$ o = ($type$) vh.getAndBitwiseOrRelease($value2$); 1293 assertEquals($value1$, o, "getAndBitwiseOrRelease $type$"); 1294 $type$ x = ($type$) vh.get(); 1295 assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrRelease $type$ value"); 1296 } 1297 1298 // get and bitwise and 1299 { 1300 vh.set($value1$); 1301 1302 $type$ o = ($type$) vh.getAndBitwiseAnd($value2$); 1303 assertEquals($value1$, o, "getAndBitwiseAnd $type$"); 1304 $type$ x = ($type$) vh.get(); 1305 assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAnd $type$ value"); 1306 } 1307 1308 { 1309 vh.set($value1$); 1310 1311 $type$ o = ($type$) vh.getAndBitwiseAndAcquire($value2$); 1312 assertEquals($value1$, o, "getAndBitwiseAndAcquire $type$"); 1313 $type$ x = ($type$) vh.get(); 1314 assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndAcquire $type$ value"); 1315 } 1316 1317 { 1318 vh.set($value1$); 1319 1320 $type$ o = ($type$) vh.getAndBitwiseAndRelease($value2$); 1321 assertEquals($value1$, o, "getAndBitwiseAndRelease $type$"); 1322 $type$ x = ($type$) vh.get(); 1323 assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndRelease $type$ value"); 1324 } 1325 1326 // get and bitwise xor 1327 { 1328 vh.set($value1$); 1329 1330 $type$ o = ($type$) vh.getAndBitwiseXor($value2$); 1331 assertEquals($value1$, o, "getAndBitwiseXor $type$"); 1332 $type$ x = ($type$) vh.get(); 1333 assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXor $type$ value"); 1334 } 1335 1336 { 1337 vh.set($value1$); 1338 1339 $type$ o = ($type$) vh.getAndBitwiseXorAcquire($value2$); 1340 assertEquals($value1$, o, "getAndBitwiseXorAcquire $type$"); 1341 $type$ x = ($type$) vh.get(); 1342 assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorAcquire $type$ value"); 1343 } 1344 1345 { 1346 vh.set($value1$); 1347 1348 $type$ o = ($type$) vh.getAndBitwiseXorRelease($value2$); 1349 assertEquals($value1$, o, "getAndBitwiseXorRelease $type$"); 1350 $type$ x = ($type$) vh.get(); 1351 assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorRelease $type$ value"); 1352 } 1353 #end[Bitwise] 1354 } 1355 1356 static void testStaticFieldUnsupported(VarHandle vh) { 1357 #if[!CAS] 1358 checkUOE(() -> { 1359 boolean r = vh.compareAndSet($value1$, $value2$); 1360 }); 1361 1362 checkUOE(() -> { 1363 $type$ r = ($type$) vh.compareAndExchange($value1$, $value2$); 1364 }); 1365 1366 checkUOE(() -> { 1367 $type$ r = ($type$) vh.compareAndExchangeAcquire($value1$, $value2$); 1368 }); 1369 1370 checkUOE(() -> { 1371 $type$ r = ($type$) vh.compareAndExchangeRelease($value1$, $value2$); 1372 }); 1373 1374 checkUOE(() -> { 1375 boolean r = vh.weakCompareAndSetPlain($value1$, $value2$); 1376 }); 1377 1378 checkUOE(() -> { 1379 boolean r = vh.weakCompareAndSet($value1$, $value2$); 1380 }); 1381 1382 checkUOE(() -> { 1383 boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$); 1384 }); 1385 1386 checkUOE(() -> { 1387 boolean r = vh.weakCompareAndSetRelease($value1$, $value2$); 1388 }); 1389 1390 checkUOE(() -> { 1391 $type$ r = ($type$) vh.getAndSet($value1$); 1392 }); 1393 1394 checkUOE(() -> { 1395 $type$ r = ($type$) vh.getAndSetAcquire($value1$); 1396 }); 1397 1398 checkUOE(() -> { 1399 $type$ r = ($type$) vh.getAndSetRelease($value1$); 1400 }); 1401 #end[CAS] 1402 1403 #if[!AtomicAdd] 1404 checkUOE(() -> { 1405 $type$ o = ($type$) vh.getAndAdd($value1$); 1406 }); 1407 1408 checkUOE(() -> { 1409 $type$ o = ($type$) vh.getAndAddAcquire($value1$); 1410 }); 1411 1412 checkUOE(() -> { 1413 $type$ o = ($type$) vh.getAndAddRelease($value1$); 1414 }); 1415 #end[AtomicAdd] 1416 1417 #if[!Bitwise] 1418 checkUOE(() -> { 1419 $type$ o = ($type$) vh.getAndBitwiseOr($value1$); 1420 }); 1421 1422 checkUOE(() -> { 1423 $type$ o = ($type$) vh.getAndBitwiseOrAcquire($value1$); 1424 }); 1425 1426 checkUOE(() -> { 1427 $type$ o = ($type$) vh.getAndBitwiseOrRelease($value1$); 1428 }); 1429 1430 checkUOE(() -> { 1431 $type$ o = ($type$) vh.getAndBitwiseAnd($value1$); 1432 }); 1433 1434 checkUOE(() -> { 1435 $type$ o = ($type$) vh.getAndBitwiseAndAcquire($value1$); 1436 }); 1437 1438 checkUOE(() -> { 1439 $type$ o = ($type$) vh.getAndBitwiseAndRelease($value1$); 1440 }); 1441 1442 checkUOE(() -> { 1443 $type$ o = ($type$) vh.getAndBitwiseXor($value1$); 1444 }); 1445 1446 checkUOE(() -> { 1447 $type$ o = ($type$) vh.getAndBitwiseXorAcquire($value1$); 1448 }); 1449 1450 checkUOE(() -> { 1451 $type$ o = ($type$) vh.getAndBitwiseXorRelease($value1$); 1452 }); 1453 #end[Bitwise] 1454 } 1455 1456 1457 static void testArray(VarHandle vh) { 1458 $type$[] array = new $type$[10]; 1459 1460 for (int i = 0; i < array.length; i++) { 1461 // Plain 1462 { 1463 vh.set(array, i, $value1$); 1464 $type$ x = ($type$) vh.get(array, i); 1465 assertEquals($value1$, x, "get $type$ value"); 1466 } 1467 1468 1469 // Volatile 1470 { 1471 vh.setVolatile(array, i, $value2$); 1472 $type$ x = ($type$) vh.getVolatile(array, i); 1473 assertEquals($value2$, x, "setVolatile $type$ value"); 1474 } 1475 1476 // Lazy 1477 { 1478 vh.setRelease(array, i, $value1$); 1479 $type$ x = ($type$) vh.getAcquire(array, i); 1480 assertEquals($value1$, x, "setRelease $type$ value"); 1481 } 1482 1483 // Opaque 1484 { 1485 vh.setOpaque(array, i, $value2$); 1486 $type$ x = ($type$) vh.getOpaque(array, i); 1487 assertEquals($value2$, x, "setOpaque $type$ value"); 1488 } 1489 1490 #if[CAS] 1491 vh.set(array, i, $value1$); 1492 1493 // Compare 1494 { 1495 boolean r = vh.compareAndSet(array, i, $value1$, $value2$); 1496 assertEquals(r, true, "success compareAndSet $type$"); 1497 $type$ x = ($type$) vh.get(array, i); 1498 assertEquals($value2$, x, "success compareAndSet $type$ value"); 1499 } 1500 1501 { 1502 boolean r = vh.compareAndSet(array, i, $value1$, $value3$); 1503 assertEquals(r, false, "failing compareAndSet $type$"); 1504 $type$ x = ($type$) vh.get(array, i); 1505 assertEquals($value2$, x, "failing compareAndSet $type$ value"); 1506 } 1507 1508 { 1509 $type$ r = ($type$) vh.compareAndExchange(array, i, $value2$, $value1$); 1510 assertEquals(r, $value2$, "success compareAndExchange $type$"); 1511 $type$ x = ($type$) vh.get(array, i); 1512 assertEquals($value1$, x, "success compareAndExchange $type$ value"); 1513 } 1514 1515 { 1516 $type$ r = ($type$) vh.compareAndExchange(array, i, $value2$, $value3$); 1517 assertEquals(r, $value1$, "failing compareAndExchange $type$"); 1518 $type$ x = ($type$) vh.get(array, i); 1519 assertEquals($value1$, x, "failing compareAndExchange $type$ value"); 1520 } 1521 1522 { 1523 $type$ r = ($type$) vh.compareAndExchangeAcquire(array, i, $value1$, $value2$); 1524 assertEquals(r, $value1$, "success compareAndExchangeAcquire $type$"); 1525 $type$ x = ($type$) vh.get(array, i); 1526 assertEquals($value2$, x, "success compareAndExchangeAcquire $type$ value"); 1527 } 1528 1529 { 1530 $type$ r = ($type$) vh.compareAndExchangeAcquire(array, i, $value1$, $value3$); 1531 assertEquals(r, $value2$, "failing compareAndExchangeAcquire $type$"); 1532 $type$ x = ($type$) vh.get(array, i); 1533 assertEquals($value2$, x, "failing compareAndExchangeAcquire $type$ value"); 1534 } 1535 1536 { 1537 $type$ r = ($type$) vh.compareAndExchangeRelease(array, i, $value2$, $value1$); 1538 assertEquals(r, $value2$, "success compareAndExchangeRelease $type$"); 1539 $type$ x = ($type$) vh.get(array, i); 1540 assertEquals($value1$, x, "success compareAndExchangeRelease $type$ value"); 1541 } 1542 1543 { 1544 $type$ r = ($type$) vh.compareAndExchangeRelease(array, i, $value2$, $value3$); 1545 assertEquals(r, $value1$, "failing compareAndExchangeRelease $type$"); 1546 $type$ x = ($type$) vh.get(array, i); 1547 assertEquals($value1$, x, "failing compareAndExchangeRelease $type$ value"); 1548 } 1549 1550 { 1551 boolean success = false; 1552 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1553 success = vh.weakCompareAndSetPlain(array, i, $value1$, $value2$); 1554 if (!success) weakDelay(); 1555 } 1556 assertEquals(success, true, "success weakCompareAndSetPlain $type$"); 1557 $type$ x = ($type$) vh.get(array, i); 1558 assertEquals($value2$, x, "success weakCompareAndSetPlain $type$ value"); 1559 } 1560 1561 { 1562 boolean success = vh.weakCompareAndSetPlain(array, i, $value1$, $value3$); 1563 assertEquals(success, false, "failing weakCompareAndSetPlain $type$"); 1564 $type$ x = ($type$) vh.get(array, i); 1565 assertEquals($value2$, x, "failing weakCompareAndSetPlain $type$ value"); 1566 } 1567 1568 { 1569 boolean success = false; 1570 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1571 success = vh.weakCompareAndSetAcquire(array, i, $value2$, $value1$); 1572 if (!success) weakDelay(); 1573 } 1574 assertEquals(success, true, "success weakCompareAndSetAcquire $type$"); 1575 $type$ x = ($type$) vh.get(array, i); 1576 assertEquals($value1$, x, "success weakCompareAndSetAcquire $type$"); 1577 } 1578 1579 { 1580 boolean success = vh.weakCompareAndSetAcquire(array, i, $value2$, $value3$); 1581 assertEquals(success, false, "failing weakCompareAndSetAcquire $type$"); 1582 $type$ x = ($type$) vh.get(array, i); 1583 assertEquals($value1$, x, "failing weakCompareAndSetAcquire $type$ value"); 1584 } 1585 1586 { 1587 boolean success = false; 1588 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1589 success = vh.weakCompareAndSetRelease(array, i, $value1$, $value2$); 1590 if (!success) weakDelay(); 1591 } 1592 assertEquals(success, true, "success weakCompareAndSetRelease $type$"); 1593 $type$ x = ($type$) vh.get(array, i); 1594 assertEquals($value2$, x, "success weakCompareAndSetRelease $type$"); 1595 } 1596 1597 { 1598 boolean success = vh.weakCompareAndSetRelease(array, i, $value1$, $value3$); 1599 assertEquals(success, false, "failing weakCompareAndSetRelease $type$"); 1600 $type$ x = ($type$) vh.get(array, i); 1601 assertEquals($value2$, x, "failing weakCompareAndSetRelease $type$ value"); 1602 } 1603 1604 { 1605 boolean success = false; 1606 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1607 success = vh.weakCompareAndSet(array, i, $value2$, $value1$); 1608 if (!success) weakDelay(); 1609 } 1610 assertEquals(success, true, "success weakCompareAndSet $type$"); 1611 $type$ x = ($type$) vh.get(array, i); 1612 assertEquals($value1$, x, "success weakCompareAndSet $type$"); 1613 } 1614 1615 { 1616 boolean success = vh.weakCompareAndSet(array, i, $value2$, $value3$); 1617 assertEquals(success, false, "failing weakCompareAndSet $type$"); 1618 $type$ x = ($type$) vh.get(array, i); 1619 assertEquals($value1$, x, "failing weakCompareAndSet $type$ value"); 1620 } 1621 1622 // Compare set and get 1623 { 1624 vh.set(array, i, $value1$); 1625 1626 $type$ o = ($type$) vh.getAndSet(array, i, $value2$); 1627 assertEquals($value1$, o, "getAndSet $type$"); 1628 $type$ x = ($type$) vh.get(array, i); 1629 assertEquals($value2$, x, "getAndSet $type$ value"); 1630 } 1631 1632 { 1633 vh.set(array, i, $value1$); 1634 1635 $type$ o = ($type$) vh.getAndSetAcquire(array, i, $value2$); 1636 assertEquals($value1$, o, "getAndSetAcquire $type$"); 1637 $type$ x = ($type$) vh.get(array, i); 1638 assertEquals($value2$, x, "getAndSetAcquire $type$ value"); 1639 } 1640 1641 { 1642 vh.set(array, i, $value1$); 1643 1644 $type$ o = ($type$) vh.getAndSetRelease(array, i, $value2$); 1645 assertEquals($value1$, o, "getAndSetRelease $type$"); 1646 $type$ x = ($type$) vh.get(array, i); 1647 assertEquals($value2$, x, "getAndSetRelease $type$ value"); 1648 } 1649 #end[CAS] 1650 1651 #if[AtomicAdd] 1652 // get and add, add and get 1653 { 1654 vh.set(array, i, $value1$); 1655 1656 $type$ o = ($type$) vh.getAndAdd(array, i, $value2$); 1657 assertEquals($value1$, o, "getAndAdd $type$"); 1658 $type$ x = ($type$) vh.get(array, i); 1659 assertEquals(($type$)($value1$ + $value2$), x, "getAndAdd $type$ value"); 1660 } 1661 1662 { 1663 vh.set(array, i, $value1$); 1664 1665 $type$ o = ($type$) vh.getAndAddAcquire(array, i, $value2$); 1666 assertEquals($value1$, o, "getAndAddAcquire $type$"); 1667 $type$ x = ($type$) vh.get(array, i); 1668 assertEquals(($type$)($value1$ + $value2$), x, "getAndAddAcquire $type$ value"); 1669 } 1670 1671 { 1672 vh.set(array, i, $value1$); 1673 1674 $type$ o = ($type$) vh.getAndAddRelease(array, i, $value2$); 1675 assertEquals($value1$, o, "getAndAddRelease$type$"); 1676 $type$ x = ($type$) vh.get(array, i); 1677 assertEquals(($type$)($value1$ + $value2$), x, "getAndAddRelease $type$ value"); 1678 } 1679 #end[AtomicAdd] 1680 1681 #if[Bitwise] 1682 // get and bitwise or 1683 { 1684 vh.set(array, i, $value1$); 1685 1686 $type$ o = ($type$) vh.getAndBitwiseOr(array, i, $value2$); 1687 assertEquals($value1$, o, "getAndBitwiseOr $type$"); 1688 $type$ x = ($type$) vh.get(array, i); 1689 assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOr $type$ value"); 1690 } 1691 1692 { 1693 vh.set(array, i, $value1$); 1694 1695 $type$ o = ($type$) vh.getAndBitwiseOrAcquire(array, i, $value2$); 1696 assertEquals($value1$, o, "getAndBitwiseOrAcquire $type$"); 1697 $type$ x = ($type$) vh.get(array, i); 1698 assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrAcquire $type$ value"); 1699 } 1700 1701 { 1702 vh.set(array, i, $value1$); 1703 1704 $type$ o = ($type$) vh.getAndBitwiseOrRelease(array, i, $value2$); 1705 assertEquals($value1$, o, "getAndBitwiseOrRelease $type$"); 1706 $type$ x = ($type$) vh.get(array, i); 1707 assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrRelease $type$ value"); 1708 } 1709 1710 // get and bitwise and 1711 { 1712 vh.set(array, i, $value1$); 1713 1714 $type$ o = ($type$) vh.getAndBitwiseAnd(array, i, $value2$); 1715 assertEquals($value1$, o, "getAndBitwiseAnd $type$"); 1716 $type$ x = ($type$) vh.get(array, i); 1717 assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAnd $type$ value"); 1718 } 1719 1720 { 1721 vh.set(array, i, $value1$); 1722 1723 $type$ o = ($type$) vh.getAndBitwiseAndAcquire(array, i, $value2$); 1724 assertEquals($value1$, o, "getAndBitwiseAndAcquire $type$"); 1725 $type$ x = ($type$) vh.get(array, i); 1726 assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndAcquire $type$ value"); 1727 } 1728 1729 { 1730 vh.set(array, i, $value1$); 1731 1732 $type$ o = ($type$) vh.getAndBitwiseAndRelease(array, i, $value2$); 1733 assertEquals($value1$, o, "getAndBitwiseAndRelease $type$"); 1734 $type$ x = ($type$) vh.get(array, i); 1735 assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndRelease $type$ value"); 1736 } 1737 1738 // get and bitwise xor 1739 { 1740 vh.set(array, i, $value1$); 1741 1742 $type$ o = ($type$) vh.getAndBitwiseXor(array, i, $value2$); 1743 assertEquals($value1$, o, "getAndBitwiseXor $type$"); 1744 $type$ x = ($type$) vh.get(array, i); 1745 assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXor $type$ value"); 1746 } 1747 1748 { 1749 vh.set(array, i, $value1$); 1750 1751 $type$ o = ($type$) vh.getAndBitwiseXorAcquire(array, i, $value2$); 1752 assertEquals($value1$, o, "getAndBitwiseXorAcquire $type$"); 1753 $type$ x = ($type$) vh.get(array, i); 1754 assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorAcquire $type$ value"); 1755 } 1756 1757 { 1758 vh.set(array, i, $value1$); 1759 1760 $type$ o = ($type$) vh.getAndBitwiseXorRelease(array, i, $value2$); 1761 assertEquals($value1$, o, "getAndBitwiseXorRelease $type$"); 1762 $type$ x = ($type$) vh.get(array, i); 1763 assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorRelease $type$ value"); 1764 } 1765 #end[Bitwise] 1766 } 1767 } 1768 1769 static void testArrayUnsupported(VarHandle vh) { 1770 $type$[] array = new $type$[10]; 1771 1772 int i = 0; 1773 #if[!CAS] 1774 checkUOE(() -> { 1775 boolean r = vh.compareAndSet(array, i, $value1$, $value2$); 1776 }); 1777 1778 checkUOE(() -> { 1779 $type$ r = ($type$) vh.compareAndExchange(array, i, $value1$, $value2$); 1780 }); 1781 1782 checkUOE(() -> { 1783 $type$ r = ($type$) vh.compareAndExchangeAcquire(array, i, $value1$, $value2$); 1784 }); 1785 1786 checkUOE(() -> { 1787 $type$ r = ($type$) vh.compareAndExchangeRelease(array, i, $value1$, $value2$); 1788 }); 1789 1790 checkUOE(() -> { 1791 boolean r = vh.weakCompareAndSetPlain(array, i, $value1$, $value2$); 1792 }); 1793 1794 checkUOE(() -> { 1795 boolean r = vh.weakCompareAndSet(array, i, $value1$, $value2$); 1796 }); 1797 1798 checkUOE(() -> { 1799 boolean r = vh.weakCompareAndSetAcquire(array, i, $value1$, $value2$); 1800 }); 1801 1802 checkUOE(() -> { 1803 boolean r = vh.weakCompareAndSetRelease(array, i, $value1$, $value2$); 1804 }); 1805 1806 checkUOE(() -> { 1807 $type$ r = ($type$) vh.getAndSet(array, i, $value1$); 1808 }); 1809 1810 checkUOE(() -> { 1811 $type$ r = ($type$) vh.getAndSetAcquire(array, i, $value1$); 1812 }); 1813 1814 checkUOE(() -> { 1815 $type$ r = ($type$) vh.getAndSetRelease(array, i, $value1$); 1816 }); 1817 #end[CAS] 1818 1819 #if[!AtomicAdd] 1820 checkUOE(() -> { 1821 $type$ o = ($type$) vh.getAndAdd(array, i, $value1$); 1822 }); 1823 1824 checkUOE(() -> { 1825 $type$ o = ($type$) vh.getAndAddAcquire(array, i, $value1$); 1826 }); 1827 1828 checkUOE(() -> { 1829 $type$ o = ($type$) vh.getAndAddRelease(array, i, $value1$); 1830 }); 1831 #end[AtomicAdd] 1832 1833 #if[!Bitwise] 1834 checkUOE(() -> { 1835 $type$ o = ($type$) vh.getAndBitwiseOr(array, i, $value1$); 1836 }); 1837 1838 checkUOE(() -> { 1839 $type$ o = ($type$) vh.getAndBitwiseOrAcquire(array, i, $value1$); 1840 }); 1841 1842 checkUOE(() -> { 1843 $type$ o = ($type$) vh.getAndBitwiseOrRelease(array, i, $value1$); 1844 }); 1845 1846 checkUOE(() -> { 1847 $type$ o = ($type$) vh.getAndBitwiseAnd(array, i, $value1$); 1848 }); 1849 1850 checkUOE(() -> { 1851 $type$ o = ($type$) vh.getAndBitwiseAndAcquire(array, i, $value1$); 1852 }); 1853 1854 checkUOE(() -> { 1855 $type$ o = ($type$) vh.getAndBitwiseAndRelease(array, i, $value1$); 1856 }); 1857 1858 checkUOE(() -> { 1859 $type$ o = ($type$) vh.getAndBitwiseXor(array, i, $value1$); 1860 }); 1861 1862 checkUOE(() -> { 1863 $type$ o = ($type$) vh.getAndBitwiseXorAcquire(array, i, $value1$); 1864 }); 1865 1866 checkUOE(() -> { 1867 $type$ o = ($type$) vh.getAndBitwiseXorRelease(array, i, $value1$); 1868 }); 1869 #end[Bitwise] 1870 } 1871 1872 static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable { 1873 $type$[] array = new $type$[10]; 1874 1875 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 1876 final int ci = i; 1877 1878 checkAIOOBE(() -> { 1879 $type$ x = ($type$) vh.get(array, ci); 1880 }); 1881 1882 checkAIOOBE(() -> { 1883 vh.set(array, ci, $value1$); 1884 }); 1885 1886 checkAIOOBE(() -> { 1887 $type$ x = ($type$) vh.getVolatile(array, ci); 1888 }); 1889 1890 checkAIOOBE(() -> { 1891 vh.setVolatile(array, ci, $value1$); 1892 }); 1893 1894 checkAIOOBE(() -> { 1895 $type$ x = ($type$) vh.getAcquire(array, ci); 1896 }); 1897 1898 checkAIOOBE(() -> { 1899 vh.setRelease(array, ci, $value1$); 1900 }); 1901 1902 checkAIOOBE(() -> { 1903 $type$ x = ($type$) vh.getOpaque(array, ci); 1904 }); 1905 1906 checkAIOOBE(() -> { 1907 vh.setOpaque(array, ci, $value1$); 1908 }); 1909 1910 #if[CAS] 1911 checkAIOOBE(() -> { 1912 boolean r = vh.compareAndSet(array, ci, $value1$, $value2$); 1913 }); 1914 1915 checkAIOOBE(() -> { 1916 $type$ r = ($type$) vh.compareAndExchange(array, ci, $value2$, $value1$); 1917 }); 1918 1919 checkAIOOBE(() -> { 1920 $type$ r = ($type$) vh.compareAndExchangeAcquire(array, ci, $value2$, $value1$); 1921 }); 1922 1923 checkAIOOBE(() -> { 1924 $type$ r = ($type$) vh.compareAndExchangeRelease(array, ci, $value2$, $value1$); 1925 }); 1926 1927 checkAIOOBE(() -> { 1928 boolean r = vh.weakCompareAndSetPlain(array, ci, $value1$, $value2$); 1929 }); 1930 1931 checkAIOOBE(() -> { 1932 boolean r = vh.weakCompareAndSet(array, ci, $value1$, $value2$); 1933 }); 1934 1935 checkAIOOBE(() -> { 1936 boolean r = vh.weakCompareAndSetAcquire(array, ci, $value1$, $value2$); 1937 }); 1938 1939 checkAIOOBE(() -> { 1940 boolean r = vh.weakCompareAndSetRelease(array, ci, $value1$, $value2$); 1941 }); 1942 1943 checkAIOOBE(() -> { 1944 $type$ o = ($type$) vh.getAndSet(array, ci, $value1$); 1945 }); 1946 1947 checkAIOOBE(() -> { 1948 $type$ o = ($type$) vh.getAndSetAcquire(array, ci, $value1$); 1949 }); 1950 1951 checkAIOOBE(() -> { 1952 $type$ o = ($type$) vh.getAndSetRelease(array, ci, $value1$); 1953 }); 1954 #end[CAS] 1955 1956 #if[AtomicAdd] 1957 checkAIOOBE(() -> { 1958 $type$ o = ($type$) vh.getAndAdd(array, ci, $value1$); 1959 }); 1960 1961 checkAIOOBE(() -> { 1962 $type$ o = ($type$) vh.getAndAddAcquire(array, ci, $value1$); 1963 }); 1964 1965 checkAIOOBE(() -> { 1966 $type$ o = ($type$) vh.getAndAddRelease(array, ci, $value1$); 1967 }); 1968 #end[AtomicAdd] 1969 1970 #if[Bitwise] 1971 checkAIOOBE(() -> { 1972 $type$ o = ($type$) vh.getAndBitwiseOr(array, ci, $value1$); 1973 }); 1974 1975 checkAIOOBE(() -> { 1976 $type$ o = ($type$) vh.getAndBitwiseOrAcquire(array, ci, $value1$); 1977 }); 1978 1979 checkAIOOBE(() -> { 1980 $type$ o = ($type$) vh.getAndBitwiseOrRelease(array, ci, $value1$); 1981 }); 1982 1983 checkAIOOBE(() -> { 1984 $type$ o = ($type$) vh.getAndBitwiseAnd(array, ci, $value1$); 1985 }); 1986 1987 checkAIOOBE(() -> { 1988 $type$ o = ($type$) vh.getAndBitwiseAndAcquire(array, ci, $value1$); 1989 }); 1990 1991 checkAIOOBE(() -> { 1992 $type$ o = ($type$) vh.getAndBitwiseAndRelease(array, ci, $value1$); 1993 }); 1994 1995 checkAIOOBE(() -> { 1996 $type$ o = ($type$) vh.getAndBitwiseXor(array, ci, $value1$); 1997 }); 1998 1999 checkAIOOBE(() -> { 2000 $type$ o = ($type$) vh.getAndBitwiseXorAcquire(array, ci, $value1$); 2001 }); 2002 2003 checkAIOOBE(() -> { 2004 $type$ o = ($type$) vh.getAndBitwiseXorRelease(array, ci, $value1$); 2005 }); 2006 #end[Bitwise] 2007 } 2008 } 2009 2010 #if[Object] 2011 static void testArrayStoreException(VarHandle vh) throws Throwable { 2012 Object[] array = new $type$[10]; 2013 Arrays.fill(array, $value1$); 2014 Object value = new Object(); 2015 2016 // Set 2017 checkASE(() -> { 2018 vh.set(array, 0, value); 2019 }); 2020 2021 // SetVolatile 2022 checkASE(() -> { 2023 vh.setVolatile(array, 0, value); 2024 }); 2025 2026 // SetOpaque 2027 checkASE(() -> { 2028 vh.setOpaque(array, 0, value); 2029 }); 2030 2031 // SetRelease 2032 checkASE(() -> { 2033 vh.setRelease(array, 0, value); 2034 }); 2035 2036 // CompareAndSet 2037 checkASE(() -> { // receiver reference class 2038 boolean r = vh.compareAndSet(array, 0, $value1$, value); 2039 }); 2040 2041 // WeakCompareAndSet 2042 checkASE(() -> { // receiver reference class 2043 boolean r = vh.weakCompareAndSetPlain(array, 0, $value1$, value); 2044 }); 2045 2046 // WeakCompareAndSetVolatile 2047 checkASE(() -> { // receiver reference class 2048 boolean r = vh.weakCompareAndSet(array, 0, $value1$, value); 2049 }); 2050 2051 // WeakCompareAndSetAcquire 2052 checkASE(() -> { // receiver reference class 2053 boolean r = vh.weakCompareAndSetAcquire(array, 0, $value1$, value); 2054 }); 2055 2056 // WeakCompareAndSetRelease 2057 checkASE(() -> { // receiver reference class 2058 boolean r = vh.weakCompareAndSetRelease(array, 0, $value1$, value); 2059 }); 2060 2061 // CompareAndExchange 2062 checkASE(() -> { // receiver reference class 2063 $type$ x = ($type$) vh.compareAndExchange(array, 0, $value1$, value); 2064 }); 2065 2066 // CompareAndExchangeAcquire 2067 checkASE(() -> { // receiver reference class 2068 $type$ x = ($type$) vh.compareAndExchangeAcquire(array, 0, $value1$, value); 2069 }); 2070 2071 // CompareAndExchangeRelease 2072 checkASE(() -> { // receiver reference class 2073 $type$ x = ($type$) vh.compareAndExchangeRelease(array, 0, $value1$, value); 2074 }); 2075 2076 // GetAndSet 2077 checkASE(() -> { // receiver reference class 2078 $type$ x = ($type$) vh.getAndSet(array, 0, value); 2079 }); 2080 2081 // GetAndSetAcquire 2082 checkASE(() -> { // receiver reference class 2083 $type$ x = ($type$) vh.getAndSetAcquire(array, 0, value); 2084 }); 2085 2086 // GetAndSetRelease 2087 checkASE(() -> { // receiver reference class 2088 $type$ x = ($type$) vh.getAndSetRelease(array, 0, value); 2089 }); 2090 } 2091 #end[Object] 2092 } 2093 --- EOF ---