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 * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations 31 * to hit compilation thresholds 32 * @run testng/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 VarHandleTestMethodHandleAccessValue 33 */ 34 35 import org.testng.annotations.BeforeClass; 36 import org.testng.annotations.DataProvider; 37 import org.testng.annotations.Test; 38 39 import java.lang.invoke.MethodHandle; 40 import java.lang.invoke.MethodHandles; 41 import java.lang.invoke.VarHandle; 42 import java.util.ArrayList; 43 import java.util.Arrays; 44 import java.util.List; 45 46 import static org.testng.Assert.*; 47 48 public class VarHandleTestMethodHandleAccessValue extends VarHandleBaseTest { 49 static final Value static_final_v = Value.getInstance(10); 50 51 static Value static_v; 52 53 final Value final_v = Value.getInstance(10); 54 55 Value v; 56 57 VarHandle vhFinalField; 58 59 VarHandle vhField; 60 61 VarHandle vhStaticField; 62 63 VarHandle vhStaticFinalField; 64 65 VarHandle vhArray; 66 67 @BeforeClass 68 public void setup() throws Exception { 69 vhFinalField = MethodHandles.lookup().findVarHandle( 70 VarHandleTestMethodHandleAccessValue.class, "final_v", Value.class); 71 72 vhField = MethodHandles.lookup().findVarHandle( 73 VarHandleTestMethodHandleAccessValue.class, "v", Value.class); 74 75 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle( 76 VarHandleTestMethodHandleAccessValue.class, "static_final_v", Value.class); 77 78 vhStaticField = MethodHandles.lookup().findStaticVarHandle( 79 VarHandleTestMethodHandleAccessValue.class, "static_v", Value.class); 80 81 vhArray = MethodHandles.arrayElementVarHandle(Value[].class); 82 } 83 84 85 @DataProvider 86 public Object[][] accessTestCaseProvider() throws Exception { 87 List<AccessTestCase<?>> cases = new ArrayList<>(); 88 89 for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { 90 cases.add(new MethodHandleAccessTestCase("Instance field", 91 vhField, f, hs -> testInstanceField(this, hs))); 92 cases.add(new MethodHandleAccessTestCase("Instance field unsupported", 93 vhField, f, hs -> testInstanceFieldUnsupported(this, hs), 94 false)); 95 96 cases.add(new MethodHandleAccessTestCase("Static field", 97 vhStaticField, f, VarHandleTestMethodHandleAccessValue::testStaticField)); 98 cases.add(new MethodHandleAccessTestCase("Static field unsupported", 99 vhStaticField, f, VarHandleTestMethodHandleAccessValue::testStaticFieldUnsupported, 100 false)); 101 102 cases.add(new MethodHandleAccessTestCase("Array", 103 vhArray, f, VarHandleTestMethodHandleAccessValue::testArray)); 104 cases.add(new MethodHandleAccessTestCase("Array unsupported", 105 vhArray, f, VarHandleTestMethodHandleAccessValue::testArrayUnsupported, 106 false)); 107 cases.add(new MethodHandleAccessTestCase("Array index out of bounds", 108 vhArray, f, VarHandleTestMethodHandleAccessValue::testArrayIndexOutOfBounds, 109 false)); 110 } 111 112 // Work around issue with jtreg summary reporting which truncates 113 // the String result of Object.toString to 30 characters, hence 114 // the first dummy argument 115 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new); 116 } 117 118 @Test(dataProvider = "accessTestCaseProvider") 119 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 120 T t = atc.get(); 121 int iters = atc.requiresLoop() ? ITERS : 1; 122 for (int c = 0; c < iters; c++) { 123 atc.testAccess(t); 124 } 125 } 126 127 128 static void testInstanceField(VarHandleTestMethodHandleAccessValue recv, Handles hs) throws Throwable { 129 // Plain 130 { 131 hs.get(TestAccessMode.SET).invokeExact(recv, Value.getInstance(10)); 132 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 133 assertEquals(x, Value.getInstance(10), "set Value value"); 134 } 135 136 137 // Volatile 138 { 139 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, Value.getInstance(20)); 140 Value x = (Value) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv); 141 assertEquals(x, Value.getInstance(20), "setVolatile Value value"); 142 } 143 144 // Lazy 145 { 146 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, Value.getInstance(10)); 147 Value x = (Value) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv); 148 assertEquals(x, Value.getInstance(10), "setRelease Value value"); 149 } 150 151 // Opaque 152 { 153 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, Value.getInstance(20)); 154 Value x = (Value) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv); 155 assertEquals(x, Value.getInstance(20), "setOpaque Value value"); 156 } 157 158 hs.get(TestAccessMode.SET).invokeExact(recv, Value.getInstance(10)); 159 160 // Compare 161 { 162 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, Value.getInstance(10), Value.getInstance(20)); 163 assertEquals(r, true, "success compareAndSet Value"); 164 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 165 assertEquals(x, Value.getInstance(20), "success compareAndSet Value value"); 166 } 167 168 { 169 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, Value.getInstance(10), Value.getInstance(30)); 170 assertEquals(r, false, "failing compareAndSet Value"); 171 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 172 assertEquals(x, Value.getInstance(20), "failing compareAndSet Value value"); 173 } 174 175 { 176 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, Value.getInstance(20), Value.getInstance(10)); 177 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value"); 178 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 179 assertEquals(x, Value.getInstance(10), "success compareAndExchange Value value"); 180 } 181 182 { 183 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, Value.getInstance(20), Value.getInstance(30)); 184 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value"); 185 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 186 assertEquals(x, Value.getInstance(10), "failing compareAndExchange Value value"); 187 } 188 189 { 190 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, Value.getInstance(10), Value.getInstance(20)); 191 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value"); 192 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 193 assertEquals(x, Value.getInstance(20), "success compareAndExchangeAcquire Value value"); 194 } 195 196 { 197 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, Value.getInstance(10), Value.getInstance(30)); 198 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value"); 199 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 200 assertEquals(x, Value.getInstance(20), "failing compareAndExchangeAcquire Value value"); 201 } 202 203 { 204 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, Value.getInstance(20), Value.getInstance(10)); 205 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value"); 206 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 207 assertEquals(x, Value.getInstance(10), "success compareAndExchangeRelease Value value"); 208 } 209 210 { 211 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, Value.getInstance(20), Value.getInstance(30)); 212 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value"); 213 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 214 assertEquals(x, Value.getInstance(10), "failing compareAndExchangeRelease Value value"); 215 } 216 217 { 218 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN); 219 boolean success = false; 220 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 221 success = (boolean) mh.invokeExact(recv, Value.getInstance(10), Value.getInstance(20)); 222 if (!success) weakDelay(); 223 } 224 assertEquals(success, true, "success weakCompareAndSetPlain Value"); 225 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 226 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetPlain Value value"); 227 } 228 229 { 230 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, Value.getInstance(10), Value.getInstance(30)); 231 assertEquals(success, false, "failing weakCompareAndSetPlain Value"); 232 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 233 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetPlain Value value"); 234 } 235 236 { 237 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE); 238 boolean success = false; 239 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 240 success = (boolean) mh.invokeExact(recv, Value.getInstance(20), Value.getInstance(10)); 241 if (!success) weakDelay(); 242 } 243 assertEquals(success, true, "success weakCompareAndSetAcquire Value"); 244 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 245 assertEquals(x, Value.getInstance(10), "success weakCompareAndSetAcquire Value"); 246 } 247 248 { 249 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, Value.getInstance(20), Value.getInstance(30)); 250 assertEquals(success, false, "failing weakCompareAndSetAcquire Value"); 251 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 252 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSetAcquire Value value"); 253 } 254 255 { 256 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE); 257 boolean success = false; 258 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 259 success = (boolean) mh.invokeExact(recv, Value.getInstance(10), Value.getInstance(20)); 260 if (!success) weakDelay(); 261 } 262 assertEquals(success, true, "success weakCompareAndSetRelease Value"); 263 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 264 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetRelease Value"); 265 } 266 267 { 268 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, Value.getInstance(10), Value.getInstance(30)); 269 assertEquals(success, false, "failing weakCompareAndSetRelease Value"); 270 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 271 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetRelease Value value"); 272 } 273 274 { 275 boolean success = false; 276 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET); 277 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 278 success = (boolean) mh.invokeExact(recv, Value.getInstance(20), Value.getInstance(10)); 279 if (!success) weakDelay(); 280 } 281 assertEquals(success, true, "success weakCompareAndSet Value"); 282 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 283 assertEquals(x, Value.getInstance(10), "success weakCompareAndSet Value"); 284 } 285 286 { 287 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, Value.getInstance(20), Value.getInstance(30)); 288 assertEquals(success, false, "failing weakCompareAndSet Value"); 289 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 290 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSet Value value"); 291 } 292 293 // Compare set and get 294 { 295 Value o = (Value) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, Value.getInstance(20)); 296 assertEquals(o, Value.getInstance(10), "getAndSet Value"); 297 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(recv); 298 assertEquals(x, Value.getInstance(20), "getAndSet Value value"); 299 } 300 301 302 } 303 304 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessValue recv, Handles hs) throws Throwable { 305 306 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 307 checkUOE(am, () -> { 308 Value r = (Value) hs.get(am).invokeExact(recv, Value.getInstance(10)); 309 }); 310 } 311 312 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 313 checkUOE(am, () -> { 314 Value r = (Value) hs.get(am).invokeExact(recv, Value.getInstance(10)); 315 }); 316 } 317 } 318 319 320 static void testStaticField(Handles hs) throws Throwable { 321 // Plain 322 { 323 hs.get(TestAccessMode.SET).invokeExact(Value.getInstance(10)); 324 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 325 assertEquals(x, Value.getInstance(10), "set Value value"); 326 } 327 328 329 // Volatile 330 { 331 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(Value.getInstance(20)); 332 Value x = (Value) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(); 333 assertEquals(x, Value.getInstance(20), "setVolatile Value value"); 334 } 335 336 // Lazy 337 { 338 hs.get(TestAccessMode.SET_RELEASE).invokeExact(Value.getInstance(10)); 339 Value x = (Value) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(); 340 assertEquals(x, Value.getInstance(10), "setRelease Value value"); 341 } 342 343 // Opaque 344 { 345 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(Value.getInstance(20)); 346 Value x = (Value) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(); 347 assertEquals(x, Value.getInstance(20), "setOpaque Value value"); 348 } 349 350 hs.get(TestAccessMode.SET).invokeExact(Value.getInstance(10)); 351 352 // Compare 353 { 354 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(Value.getInstance(10), Value.getInstance(20)); 355 assertEquals(r, true, "success compareAndSet Value"); 356 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 357 assertEquals(x, Value.getInstance(20), "success compareAndSet Value value"); 358 } 359 360 { 361 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(Value.getInstance(10), Value.getInstance(30)); 362 assertEquals(r, false, "failing compareAndSet Value"); 363 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 364 assertEquals(x, Value.getInstance(20), "failing compareAndSet Value value"); 365 } 366 367 { 368 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(Value.getInstance(20), Value.getInstance(10)); 369 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value"); 370 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 371 assertEquals(x, Value.getInstance(10), "success compareAndExchange Value value"); 372 } 373 374 { 375 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(Value.getInstance(20), Value.getInstance(30)); 376 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value"); 377 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 378 assertEquals(x, Value.getInstance(10), "failing compareAndExchange Value value"); 379 } 380 381 { 382 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(Value.getInstance(10), Value.getInstance(20)); 383 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value"); 384 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 385 assertEquals(x, Value.getInstance(20), "success compareAndExchangeAcquire Value value"); 386 } 387 388 { 389 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(Value.getInstance(10), Value.getInstance(30)); 390 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value"); 391 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 392 assertEquals(x, Value.getInstance(20), "failing compareAndExchangeAcquire Value value"); 393 } 394 395 { 396 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(Value.getInstance(20), Value.getInstance(10)); 397 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value"); 398 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 399 assertEquals(x, Value.getInstance(10), "success compareAndExchangeRelease Value value"); 400 } 401 402 { 403 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(Value.getInstance(20), Value.getInstance(30)); 404 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value"); 405 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 406 assertEquals(x, Value.getInstance(10), "failing compareAndExchangeRelease Value value"); 407 } 408 409 { 410 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN); 411 boolean success = false; 412 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 413 success = (boolean) mh.invokeExact(Value.getInstance(10), Value.getInstance(20)); 414 if (!success) weakDelay(); 415 } 416 assertEquals(success, true, "success weakCompareAndSetPlain Value"); 417 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 418 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetPlain Value value"); 419 } 420 421 { 422 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(Value.getInstance(10), Value.getInstance(30)); 423 assertEquals(success, false, "failing weakCompareAndSetPlain Value"); 424 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 425 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetPlain Value value"); 426 } 427 428 { 429 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE); 430 boolean success = false; 431 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 432 success = (boolean) mh.invokeExact(Value.getInstance(20), Value.getInstance(10)); 433 if (!success) weakDelay(); 434 } 435 assertEquals(success, true, "success weakCompareAndSetAcquire Value"); 436 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 437 assertEquals(x, Value.getInstance(10), "success weakCompareAndSetAcquire Value"); 438 } 439 440 { 441 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE); 442 boolean success = (boolean) mh.invokeExact(Value.getInstance(20), Value.getInstance(30)); 443 assertEquals(success, false, "failing weakCompareAndSetAcquire Value"); 444 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 445 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSetAcquire Value value"); 446 } 447 448 { 449 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE); 450 boolean success = false; 451 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 452 success = (boolean) mh.invokeExact(Value.getInstance(10), Value.getInstance(20)); 453 if (!success) weakDelay(); 454 } 455 assertEquals(success, true, "success weakCompareAndSetRelease Value"); 456 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 457 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetRelease Value"); 458 } 459 460 { 461 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(Value.getInstance(10), Value.getInstance(30)); 462 assertEquals(success, false, "failing weakCompareAndSetRelease Value"); 463 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 464 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetRelease Value value"); 465 } 466 467 { 468 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET); 469 boolean success = false; 470 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 471 success = (boolean) mh.invokeExact(Value.getInstance(20), Value.getInstance(10)); 472 if (!success) weakDelay(); 473 } 474 assertEquals(success, true, "success weakCompareAndSet Value"); 475 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 476 assertEquals(x, Value.getInstance(10), "success weakCompareAndSet Value"); 477 } 478 479 { 480 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(Value.getInstance(20), Value.getInstance(30)); 481 assertEquals(success, false, "failing weakCompareAndSet Value"); 482 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 483 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSetRe Value value"); 484 } 485 486 // Compare set and get 487 { 488 hs.get(TestAccessMode.SET).invokeExact(Value.getInstance(10)); 489 490 Value o = (Value) hs.get(TestAccessMode.GET_AND_SET).invokeExact(Value.getInstance(20)); 491 assertEquals(o, Value.getInstance(10), "getAndSet Value"); 492 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 493 assertEquals(x, Value.getInstance(20), "getAndSet Value value"); 494 } 495 496 // Compare set and get 497 { 498 hs.get(TestAccessMode.SET).invokeExact(Value.getInstance(10)); 499 500 Value o = (Value) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(Value.getInstance(20)); 501 assertEquals(o, Value.getInstance(10), "getAndSetAcquire Value"); 502 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 503 assertEquals(x, Value.getInstance(20), "getAndSetAcquire Value value"); 504 } 505 506 // Compare set and get 507 { 508 hs.get(TestAccessMode.SET).invokeExact(Value.getInstance(10)); 509 510 Value o = (Value) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(Value.getInstance(20)); 511 assertEquals(o, Value.getInstance(10), "getAndSetRelease Value"); 512 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(); 513 assertEquals(x, Value.getInstance(20), "getAndSetRelease Value value"); 514 } 515 516 517 } 518 519 static void testStaticFieldUnsupported(Handles hs) throws Throwable { 520 521 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 522 checkUOE(am, () -> { 523 Value r = (Value) hs.get(am).invokeExact(Value.getInstance(10)); 524 }); 525 } 526 527 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 528 checkUOE(am, () -> { 529 Value r = (Value) hs.get(am).invokeExact(Value.getInstance(10)); 530 }); 531 } 532 } 533 534 535 static void testArray(Handles hs) throws Throwable { 536 Value[] array = new Value[10]; 537 538 for (int i = 0; i < array.length; i++) { 539 // Plain 540 { 541 hs.get(TestAccessMode.SET).invokeExact(array, i, Value.getInstance(10)); 542 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 543 assertEquals(x, Value.getInstance(10), "get Value value"); 544 } 545 546 547 // Volatile 548 { 549 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, Value.getInstance(20)); 550 Value x = (Value) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i); 551 assertEquals(x, Value.getInstance(20), "setVolatile Value value"); 552 } 553 554 // Lazy 555 { 556 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, Value.getInstance(10)); 557 Value x = (Value) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i); 558 assertEquals(x, Value.getInstance(10), "setRelease Value value"); 559 } 560 561 // Opaque 562 { 563 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, Value.getInstance(20)); 564 Value x = (Value) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i); 565 assertEquals(x, Value.getInstance(20), "setOpaque Value value"); 566 } 567 568 hs.get(TestAccessMode.SET).invokeExact(array, i, Value.getInstance(10)); 569 570 // Compare 571 { 572 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, Value.getInstance(10), Value.getInstance(20)); 573 assertEquals(r, true, "success compareAndSet Value"); 574 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 575 assertEquals(x, Value.getInstance(20), "success compareAndSet Value value"); 576 } 577 578 { 579 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, Value.getInstance(10), Value.getInstance(30)); 580 assertEquals(r, false, "failing compareAndSet Value"); 581 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 582 assertEquals(x, Value.getInstance(20), "failing compareAndSet Value value"); 583 } 584 585 { 586 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, Value.getInstance(20), Value.getInstance(10)); 587 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value"); 588 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 589 assertEquals(x, Value.getInstance(10), "success compareAndExchange Value value"); 590 } 591 592 { 593 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, Value.getInstance(20), Value.getInstance(30)); 594 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value"); 595 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 596 assertEquals(x, Value.getInstance(10), "failing compareAndExchange Value value"); 597 } 598 599 { 600 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, Value.getInstance(10), Value.getInstance(20)); 601 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value"); 602 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 603 assertEquals(x, Value.getInstance(20), "success compareAndExchangeAcquire Value value"); 604 } 605 606 { 607 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, Value.getInstance(10), Value.getInstance(30)); 608 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value"); 609 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 610 assertEquals(x, Value.getInstance(20), "failing compareAndExchangeAcquire Value value"); 611 } 612 613 { 614 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, Value.getInstance(20), Value.getInstance(10)); 615 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value"); 616 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 617 assertEquals(x, Value.getInstance(10), "success compareAndExchangeRelease Value value"); 618 } 619 620 { 621 Value r = (Value) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, Value.getInstance(20), Value.getInstance(30)); 622 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value"); 623 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 624 assertEquals(x, Value.getInstance(10), "failing compareAndExchangeRelease Value value"); 625 } 626 627 { 628 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN); 629 boolean success = false; 630 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 631 success = (boolean) mh.invokeExact(array, i, Value.getInstance(10), Value.getInstance(20)); 632 if (!success) weakDelay(); 633 } 634 assertEquals(success, true, "success weakCompareAndSetPlain Value"); 635 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 636 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetPlain Value value"); 637 } 638 639 { 640 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, Value.getInstance(10), Value.getInstance(30)); 641 assertEquals(success, false, "failing weakCompareAndSetPlain Value"); 642 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 643 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetPlain Value value"); 644 } 645 646 { 647 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE); 648 boolean success = false; 649 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 650 success = (boolean) mh.invokeExact(array, i, Value.getInstance(20), Value.getInstance(10)); 651 if (!success) weakDelay(); 652 } 653 assertEquals(success, true, "success weakCompareAndSetAcquire Value"); 654 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 655 assertEquals(x, Value.getInstance(10), "success weakCompareAndSetAcquire Value"); 656 } 657 658 { 659 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, Value.getInstance(20), Value.getInstance(30)); 660 assertEquals(success, false, "failing weakCompareAndSetAcquire Value"); 661 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 662 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSetAcquire Value value"); 663 } 664 665 { 666 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE); 667 boolean success = false; 668 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 669 success = (boolean) mh.invokeExact(array, i, Value.getInstance(10), Value.getInstance(20)); 670 if (!success) weakDelay(); 671 } 672 assertEquals(success, true, "success weakCompareAndSetRelease Value"); 673 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 674 assertEquals(x, Value.getInstance(20), "success weakCompareAndSetRelease Value"); 675 } 676 677 { 678 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, Value.getInstance(10), Value.getInstance(30)); 679 assertEquals(success, false, "failing weakCompareAndSetAcquire Value"); 680 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 681 assertEquals(x, Value.getInstance(20), "failing weakCompareAndSetAcquire Value value"); 682 } 683 684 { 685 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET); 686 boolean success = false; 687 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 688 success = (boolean) mh.invokeExact(array, i, Value.getInstance(20), Value.getInstance(10)); 689 if (!success) weakDelay(); 690 } 691 assertEquals(success, true, "success weakCompareAndSet Value"); 692 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 693 assertEquals(x, Value.getInstance(10), "success weakCompareAndSet Value"); 694 } 695 696 { 697 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, Value.getInstance(20), Value.getInstance(30)); 698 assertEquals(success, false, "failing weakCompareAndSet Value"); 699 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 700 assertEquals(x, Value.getInstance(10), "failing weakCompareAndSet Value value"); 701 } 702 703 // Compare set and get 704 { 705 hs.get(TestAccessMode.SET).invokeExact(array, i, Value.getInstance(10)); 706 707 Value o = (Value) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, Value.getInstance(20)); 708 assertEquals(o, Value.getInstance(10), "getAndSet Value"); 709 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 710 assertEquals(x, Value.getInstance(20), "getAndSet Value value"); 711 } 712 713 { 714 hs.get(TestAccessMode.SET).invokeExact(array, i, Value.getInstance(10)); 715 716 Value o = (Value) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, Value.getInstance(20)); 717 assertEquals(o, Value.getInstance(10), "getAndSetAcquire Value"); 718 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 719 assertEquals(x, Value.getInstance(20), "getAndSetAcquire Value value"); 720 } 721 722 { 723 hs.get(TestAccessMode.SET).invokeExact(array, i, Value.getInstance(10)); 724 725 Value o = (Value) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, Value.getInstance(20)); 726 assertEquals(o, Value.getInstance(10), "getAndSetRelease Value"); 727 Value x = (Value) hs.get(TestAccessMode.GET).invokeExact(array, i); 728 assertEquals(x, Value.getInstance(20), "getAndSetRelease Value value"); 729 } 730 731 732 } 733 } 734 735 static void testArrayUnsupported(Handles hs) throws Throwable { 736 Value[] array = new Value[10]; 737 738 final int i = 0; 739 740 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 741 checkUOE(am, () -> { 742 Value o = (Value) hs.get(am).invokeExact(array, i, Value.getInstance(10)); 743 }); 744 } 745 746 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 747 checkUOE(am, () -> { 748 Value o = (Value) hs.get(am).invokeExact(array, i, Value.getInstance(10)); 749 }); 750 } 751 } 752 753 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable { 754 Value[] array = new Value[10]; 755 756 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 757 final int ci = i; 758 759 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { 760 checkAIOOBE(am, () -> { 761 Value x = (Value) hs.get(am).invokeExact(array, ci); 762 }); 763 } 764 765 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { 766 checkAIOOBE(am, () -> { 767 hs.get(am).invokeExact(array, ci, Value.getInstance(10)); 768 }); 769 } 770 771 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { 772 checkAIOOBE(am, () -> { 773 boolean r = (boolean) hs.get(am).invokeExact(array, ci, Value.getInstance(10), Value.getInstance(20)); 774 }); 775 } 776 777 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { 778 checkAIOOBE(am, () -> { 779 Value r = (Value) hs.get(am).invokeExact(array, ci, Value.getInstance(20), Value.getInstance(10)); 780 }); 781 } 782 783 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { 784 checkAIOOBE(am, () -> { 785 Value o = (Value) hs.get(am).invokeExact(array, ci, Value.getInstance(10)); 786 }); 787 } 788 789 790 } 791 } 792 } 793