1 /* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @run testng/othervm -Diters=10 -Xint VarHandleTestAccessDouble 27 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestAccessDouble 28 * @run testng/othervm -Diters=20000 VarHandleTestAccessDouble 29 * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestAccessDouble 30 */ 31 32 import org.testng.annotations.BeforeClass; 33 import org.testng.annotations.DataProvider; 34 import org.testng.annotations.Test; 35 36 import java.lang.invoke.MethodHandles; 37 import java.lang.invoke.VarHandle; 38 import java.util.ArrayList; 39 import java.util.Arrays; 40 import java.util.List; 41 42 import static org.testng.Assert.*; 43 44 public class VarHandleTestAccessDouble extends VarHandleBaseTest { 45 static final double static_final_v = 1.0d; 46 47 static double static_v; 48 49 final double final_v = 1.0d; 50 51 double v; 52 53 VarHandle vhFinalField; 54 55 VarHandle vhField; 56 57 VarHandle vhStaticField; 58 59 VarHandle vhStaticFinalField; 60 61 VarHandle vhArray; 62 63 @BeforeClass 64 public void setup() throws Exception { 65 vhFinalField = MethodHandles.lookup().findVarHandle( 66 VarHandleTestAccessDouble.class, "final_v", double.class); 67 68 vhField = MethodHandles.lookup().findVarHandle( 69 VarHandleTestAccessDouble.class, "v", double.class); 70 71 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle( 72 VarHandleTestAccessDouble.class, "static_final_v", double.class); 73 74 vhStaticField = MethodHandles.lookup().findStaticVarHandle( 75 VarHandleTestAccessDouble.class, "static_v", double.class); 76 77 vhArray = MethodHandles.arrayElementVarHandle(double[].class); 78 } 79 80 81 @DataProvider 82 public Object[][] varHandlesProvider() throws Exception { 83 List<VarHandle> vhs = new ArrayList<>(); 84 vhs.add(vhField); 85 vhs.add(vhStaticField); 86 vhs.add(vhArray); 87 88 return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); 89 } 90 91 @Test(dataProvider = "varHandlesProvider") 92 public void testIsAccessModeSupported(VarHandle vh) { 93 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); 94 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET)); 95 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE)); 96 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE)); 97 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE)); 98 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE)); 99 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE)); 100 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE)); 101 102 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET)); 103 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE)); 104 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); 105 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); 106 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN)); 107 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); 108 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); 109 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); 110 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); 111 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE)); 112 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE)); 113 114 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); 115 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE)); 116 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE)); 117 118 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR)); 119 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)); 120 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)); 121 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND)); 122 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)); 123 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)); 124 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR)); 125 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)); 126 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE)); 127 } 128 129 130 @DataProvider 131 public Object[][] typesProvider() throws Exception { 132 List<Object[]> types = new ArrayList<>(); 133 types.add(new Object[] {vhField, Arrays.asList(VarHandleTestAccessDouble.class)}); 134 types.add(new Object[] {vhStaticField, Arrays.asList()}); 135 types.add(new Object[] {vhArray, Arrays.asList(double[].class, int.class)}); 136 137 return types.stream().toArray(Object[][]::new); 138 } 139 140 @Test(dataProvider = "typesProvider") 141 public void testTypes(VarHandle vh, List<Class<?>> pts) { 142 assertEquals(vh.varType(), double.class); 143 144 assertEquals(vh.coordinateTypes(), pts); 145 146 testTypes(vh); 147 } 148 149 150 @Test 151 public void testLookupInstanceToStatic() { 152 checkIAE("Lookup of static final field to instance final field", () -> { 153 MethodHandles.lookup().findStaticVarHandle( 154 VarHandleTestAccessDouble.class, "final_v", double.class); 155 }); 156 157 checkIAE("Lookup of static field to instance field", () -> { 158 MethodHandles.lookup().findStaticVarHandle( 159 VarHandleTestAccessDouble.class, "v", double.class); 160 }); 161 } 162 163 @Test 164 public void testLookupStaticToInstance() { 165 checkIAE("Lookup of instance final field to static final field", () -> { 166 MethodHandles.lookup().findVarHandle( 167 VarHandleTestAccessDouble.class, "static_final_v", double.class); 168 }); 169 170 checkIAE("Lookup of instance field to static field", () -> { 171 vhStaticField = MethodHandles.lookup().findVarHandle( 172 VarHandleTestAccessDouble.class, "static_v", double.class); 173 }); 174 } 175 176 177 @DataProvider 178 public Object[][] accessTestCaseProvider() throws Exception { 179 List<AccessTestCase<?>> cases = new ArrayList<>(); 180 181 cases.add(new VarHandleAccessTestCase("Instance final field", 182 vhFinalField, vh -> testInstanceFinalField(this, vh))); 183 cases.add(new VarHandleAccessTestCase("Instance final field unsupported", 184 vhFinalField, vh -> testInstanceFinalFieldUnsupported(this, vh), 185 false)); 186 187 cases.add(new VarHandleAccessTestCase("Static final field", 188 vhStaticFinalField, VarHandleTestAccessDouble::testStaticFinalField)); 189 cases.add(new VarHandleAccessTestCase("Static final field unsupported", 190 vhStaticFinalField, VarHandleTestAccessDouble::testStaticFinalFieldUnsupported, 191 false)); 192 193 cases.add(new VarHandleAccessTestCase("Instance field", 194 vhField, vh -> testInstanceField(this, vh))); 195 cases.add(new VarHandleAccessTestCase("Instance field unsupported", 196 vhField, vh -> testInstanceFieldUnsupported(this, vh), 197 false)); 198 199 cases.add(new VarHandleAccessTestCase("Static field", 200 vhStaticField, VarHandleTestAccessDouble::testStaticField)); 201 cases.add(new VarHandleAccessTestCase("Static field unsupported", 202 vhStaticField, VarHandleTestAccessDouble::testStaticFieldUnsupported, 203 false)); 204 205 cases.add(new VarHandleAccessTestCase("Array", 206 vhArray, VarHandleTestAccessDouble::testArray)); 207 cases.add(new VarHandleAccessTestCase("Array unsupported", 208 vhArray, VarHandleTestAccessDouble::testArrayUnsupported, 209 false)); 210 cases.add(new VarHandleAccessTestCase("Array index out of bounds", 211 vhArray, VarHandleTestAccessDouble::testArrayIndexOutOfBounds, 212 false)); 213 214 // Work around issue with jtreg summary reporting which truncates 215 // the String result of Object.toString to 30 characters, hence 216 // the first dummy argument 217 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new); 218 } 219 220 @Test(dataProvider = "accessTestCaseProvider") 221 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 222 T t = atc.get(); 223 int iters = atc.requiresLoop() ? ITERS : 1; 224 for (int c = 0; c < iters; c++) { 225 atc.testAccess(t); 226 } 227 } 228 229 230 231 232 static void testInstanceFinalField(VarHandleTestAccessDouble recv, VarHandle vh) { 233 // Plain 234 { 235 double x = (double) vh.get(recv); 236 assertEquals(x, 1.0d, "get double value"); 237 } 238 239 240 // Volatile 241 { 242 double x = (double) vh.getVolatile(recv); 243 assertEquals(x, 1.0d, "getVolatile double value"); 244 } 245 246 // Lazy 247 { 248 double x = (double) vh.getAcquire(recv); 249 assertEquals(x, 1.0d, "getRelease double value"); 250 } 251 252 // Opaque 253 { 254 double x = (double) vh.getOpaque(recv); 255 assertEquals(x, 1.0d, "getOpaque double value"); 256 } 257 } 258 259 static void testInstanceFinalFieldUnsupported(VarHandleTestAccessDouble recv, VarHandle vh) { 260 checkUOE(() -> { 261 vh.set(recv, 2.0d); 262 }); 263 264 checkUOE(() -> { 265 vh.setVolatile(recv, 2.0d); 266 }); 267 268 checkUOE(() -> { 269 vh.setRelease(recv, 2.0d); 270 }); 271 272 checkUOE(() -> { 273 vh.setOpaque(recv, 2.0d); 274 }); 275 276 277 278 checkUOE(() -> { 279 double o = (double) vh.getAndBitwiseOr(recv, 1.0d); 280 }); 281 282 checkUOE(() -> { 283 double o = (double) vh.getAndBitwiseOrAcquire(recv, 1.0d); 284 }); 285 286 checkUOE(() -> { 287 double o = (double) vh.getAndBitwiseOrRelease(recv, 1.0d); 288 }); 289 290 checkUOE(() -> { 291 double o = (double) vh.getAndBitwiseAnd(recv, 1.0d); 292 }); 293 294 checkUOE(() -> { 295 double o = (double) vh.getAndBitwiseAndAcquire(recv, 1.0d); 296 }); 297 298 checkUOE(() -> { 299 double o = (double) vh.getAndBitwiseAndRelease(recv, 1.0d); 300 }); 301 302 checkUOE(() -> { 303 double o = (double) vh.getAndBitwiseXor(recv, 1.0d); 304 }); 305 306 checkUOE(() -> { 307 double o = (double) vh.getAndBitwiseXorAcquire(recv, 1.0d); 308 }); 309 310 checkUOE(() -> { 311 double o = (double) vh.getAndBitwiseXorRelease(recv, 1.0d); 312 }); 313 } 314 315 316 static void testStaticFinalField(VarHandle vh) { 317 // Plain 318 { 319 double x = (double) vh.get(); 320 assertEquals(x, 1.0d, "get double value"); 321 } 322 323 324 // Volatile 325 { 326 double x = (double) vh.getVolatile(); 327 assertEquals(x, 1.0d, "getVolatile double value"); 328 } 329 330 // Lazy 331 { 332 double x = (double) vh.getAcquire(); 333 assertEquals(x, 1.0d, "getRelease double value"); 334 } 335 336 // Opaque 337 { 338 double x = (double) vh.getOpaque(); 339 assertEquals(x, 1.0d, "getOpaque double value"); 340 } 341 } 342 343 static void testStaticFinalFieldUnsupported(VarHandle vh) { 344 checkUOE(() -> { 345 vh.set(2.0d); 346 }); 347 348 checkUOE(() -> { 349 vh.setVolatile(2.0d); 350 }); 351 352 checkUOE(() -> { 353 vh.setRelease(2.0d); 354 }); 355 356 checkUOE(() -> { 357 vh.setOpaque(2.0d); 358 }); 359 360 361 362 checkUOE(() -> { 363 double o = (double) vh.getAndBitwiseOr(1.0d); 364 }); 365 366 checkUOE(() -> { 367 double o = (double) vh.getAndBitwiseOrAcquire(1.0d); 368 }); 369 370 checkUOE(() -> { 371 double o = (double) vh.getAndBitwiseOrRelease(1.0d); 372 }); 373 374 checkUOE(() -> { 375 double o = (double) vh.getAndBitwiseAnd(1.0d); 376 }); 377 378 checkUOE(() -> { 379 double o = (double) vh.getAndBitwiseAndAcquire(1.0d); 380 }); 381 382 checkUOE(() -> { 383 double o = (double) vh.getAndBitwiseAndRelease(1.0d); 384 }); 385 386 checkUOE(() -> { 387 double o = (double) vh.getAndBitwiseXor(1.0d); 388 }); 389 390 checkUOE(() -> { 391 double o = (double) vh.getAndBitwiseXorAcquire(1.0d); 392 }); 393 394 checkUOE(() -> { 395 double o = (double) vh.getAndBitwiseXorRelease(1.0d); 396 }); 397 } 398 399 400 static void testInstanceField(VarHandleTestAccessDouble recv, VarHandle vh) { 401 // Plain 402 { 403 vh.set(recv, 1.0d); 404 double x = (double) vh.get(recv); 405 assertEquals(x, 1.0d, "set double value"); 406 } 407 408 409 // Volatile 410 { 411 vh.setVolatile(recv, 2.0d); 412 double x = (double) vh.getVolatile(recv); 413 assertEquals(x, 2.0d, "setVolatile double value"); 414 } 415 416 // Lazy 417 { 418 vh.setRelease(recv, 1.0d); 419 double x = (double) vh.getAcquire(recv); 420 assertEquals(x, 1.0d, "setRelease double value"); 421 } 422 423 // Opaque 424 { 425 vh.setOpaque(recv, 2.0d); 426 double x = (double) vh.getOpaque(recv); 427 assertEquals(x, 2.0d, "setOpaque double value"); 428 } 429 430 vh.set(recv, 1.0d); 431 432 // Compare 433 { 434 boolean r = vh.compareAndSet(recv, 1.0d, 2.0d); 435 assertEquals(r, true, "success compareAndSet double"); 436 double x = (double) vh.get(recv); 437 assertEquals(x, 2.0d, "success compareAndSet double value"); 438 } 439 440 { 441 boolean r = vh.compareAndSet(recv, 1.0d, 3.0d); 442 assertEquals(r, false, "failing compareAndSet double"); 443 double x = (double) vh.get(recv); 444 assertEquals(x, 2.0d, "failing compareAndSet double value"); 445 } 446 447 { 448 double r = (double) vh.compareAndExchange(recv, 2.0d, 1.0d); 449 assertEquals(r, 2.0d, "success compareAndExchange double"); 450 double x = (double) vh.get(recv); 451 assertEquals(x, 1.0d, "success compareAndExchange double value"); 452 } 453 454 { 455 double r = (double) vh.compareAndExchange(recv, 2.0d, 3.0d); 456 assertEquals(r, 1.0d, "failing compareAndExchange double"); 457 double x = (double) vh.get(recv); 458 assertEquals(x, 1.0d, "failing compareAndExchange double value"); 459 } 460 461 { 462 double r = (double) vh.compareAndExchangeAcquire(recv, 1.0d, 2.0d); 463 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double"); 464 double x = (double) vh.get(recv); 465 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value"); 466 } 467 468 { 469 double r = (double) vh.compareAndExchangeAcquire(recv, 1.0d, 3.0d); 470 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double"); 471 double x = (double) vh.get(recv); 472 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value"); 473 } 474 475 { 476 double r = (double) vh.compareAndExchangeRelease(recv, 2.0d, 1.0d); 477 assertEquals(r, 2.0d, "success compareAndExchangeRelease double"); 478 double x = (double) vh.get(recv); 479 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value"); 480 } 481 482 { 483 double r = (double) vh.compareAndExchangeRelease(recv, 2.0d, 3.0d); 484 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double"); 485 double x = (double) vh.get(recv); 486 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value"); 487 } 488 489 { 490 boolean success = false; 491 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 492 success = vh.weakCompareAndSetPlain(recv, 1.0d, 2.0d); 493 } 494 assertEquals(success, true, "weakCompareAndSetPlain double"); 495 double x = (double) vh.get(recv); 496 assertEquals(x, 2.0d, "weakCompareAndSetPlain double value"); 497 } 498 499 { 500 boolean success = false; 501 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 502 success = vh.weakCompareAndSetAcquire(recv, 2.0d, 1.0d); 503 } 504 assertEquals(success, true, "weakCompareAndSetAcquire double"); 505 double x = (double) vh.get(recv); 506 assertEquals(x, 1.0d, "weakCompareAndSetAcquire double"); 507 } 508 509 { 510 boolean success = false; 511 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 512 success = vh.weakCompareAndSetRelease(recv, 1.0d, 2.0d); 513 } 514 assertEquals(success, true, "weakCompareAndSetRelease double"); 515 double x = (double) vh.get(recv); 516 assertEquals(x, 2.0d, "weakCompareAndSetRelease double"); 517 } 518 519 { 520 boolean success = false; 521 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 522 success = vh.weakCompareAndSet(recv, 2.0d, 1.0d); 523 } 524 assertEquals(success, true, "weakCompareAndSet double"); 525 double x = (double) vh.get(recv); 526 assertEquals(x, 1.0d, "weakCompareAndSet double value"); 527 } 528 529 // Compare set and get 530 { 531 vh.set(recv, 1.0d); 532 533 double o = (double) vh.getAndSet(recv, 2.0d); 534 assertEquals(o, 1.0d, "getAndSet double"); 535 double x = (double) vh.get(recv); 536 assertEquals(x, 2.0d, "getAndSet double value"); 537 } 538 539 { 540 vh.set(recv, 1.0d); 541 542 double o = (double) vh.getAndSetAcquire(recv, 2.0d); 543 assertEquals(o, 1.0d, "getAndSetAcquire double"); 544 double x = (double) vh.get(recv); 545 assertEquals(x, 2.0d, "getAndSetAcquire double value"); 546 } 547 548 { 549 vh.set(recv, 1.0d); 550 551 double o = (double) vh.getAndSetRelease(recv, 2.0d); 552 assertEquals(o, 1.0d, "getAndSetRelease double"); 553 double x = (double) vh.get(recv); 554 assertEquals(x, 2.0d, "getAndSetRelease double value"); 555 } 556 557 // get and add, add and get 558 { 559 vh.set(recv, 1.0d); 560 561 double o = (double) vh.getAndAdd(recv, 2.0d); 562 assertEquals(o, 1.0d, "getAndAdd double"); 563 double x = (double) vh.get(recv); 564 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value"); 565 } 566 567 { 568 vh.set(recv, 1.0d); 569 570 double o = (double) vh.getAndAddAcquire(recv, 2.0d); 571 assertEquals(o, 1.0d, "getAndAddAcquire double"); 572 double x = (double) vh.get(recv); 573 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value"); 574 } 575 576 { 577 vh.set(recv, 1.0d); 578 579 double o = (double) vh.getAndAddRelease(recv, 2.0d); 580 assertEquals(o, 1.0d, "getAndAddReleasedouble"); 581 double x = (double) vh.get(recv); 582 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value"); 583 } 584 585 } 586 587 static void testInstanceFieldUnsupported(VarHandleTestAccessDouble recv, VarHandle vh) { 588 589 590 checkUOE(() -> { 591 double o = (double) vh.getAndBitwiseOr(recv, 1.0d); 592 }); 593 594 checkUOE(() -> { 595 double o = (double) vh.getAndBitwiseOrAcquire(recv, 1.0d); 596 }); 597 598 checkUOE(() -> { 599 double o = (double) vh.getAndBitwiseOrRelease(recv, 1.0d); 600 }); 601 602 checkUOE(() -> { 603 double o = (double) vh.getAndBitwiseAnd(recv, 1.0d); 604 }); 605 606 checkUOE(() -> { 607 double o = (double) vh.getAndBitwiseAndAcquire(recv, 1.0d); 608 }); 609 610 checkUOE(() -> { 611 double o = (double) vh.getAndBitwiseAndRelease(recv, 1.0d); 612 }); 613 614 checkUOE(() -> { 615 double o = (double) vh.getAndBitwiseXor(recv, 1.0d); 616 }); 617 618 checkUOE(() -> { 619 double o = (double) vh.getAndBitwiseXorAcquire(recv, 1.0d); 620 }); 621 622 checkUOE(() -> { 623 double o = (double) vh.getAndBitwiseXorRelease(recv, 1.0d); 624 }); 625 } 626 627 628 static void testStaticField(VarHandle vh) { 629 // Plain 630 { 631 vh.set(1.0d); 632 double x = (double) vh.get(); 633 assertEquals(x, 1.0d, "set double value"); 634 } 635 636 637 // Volatile 638 { 639 vh.setVolatile(2.0d); 640 double x = (double) vh.getVolatile(); 641 assertEquals(x, 2.0d, "setVolatile double value"); 642 } 643 644 // Lazy 645 { 646 vh.setRelease(1.0d); 647 double x = (double) vh.getAcquire(); 648 assertEquals(x, 1.0d, "setRelease double value"); 649 } 650 651 // Opaque 652 { 653 vh.setOpaque(2.0d); 654 double x = (double) vh.getOpaque(); 655 assertEquals(x, 2.0d, "setOpaque double value"); 656 } 657 658 vh.set(1.0d); 659 660 // Compare 661 { 662 boolean r = vh.compareAndSet(1.0d, 2.0d); 663 assertEquals(r, true, "success compareAndSet double"); 664 double x = (double) vh.get(); 665 assertEquals(x, 2.0d, "success compareAndSet double value"); 666 } 667 668 { 669 boolean r = vh.compareAndSet(1.0d, 3.0d); 670 assertEquals(r, false, "failing compareAndSet double"); 671 double x = (double) vh.get(); 672 assertEquals(x, 2.0d, "failing compareAndSet double value"); 673 } 674 675 { 676 double r = (double) vh.compareAndExchange(2.0d, 1.0d); 677 assertEquals(r, 2.0d, "success compareAndExchange double"); 678 double x = (double) vh.get(); 679 assertEquals(x, 1.0d, "success compareAndExchange double value"); 680 } 681 682 { 683 double r = (double) vh.compareAndExchange(2.0d, 3.0d); 684 assertEquals(r, 1.0d, "failing compareAndExchange double"); 685 double x = (double) vh.get(); 686 assertEquals(x, 1.0d, "failing compareAndExchange double value"); 687 } 688 689 { 690 double r = (double) vh.compareAndExchangeAcquire(1.0d, 2.0d); 691 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double"); 692 double x = (double) vh.get(); 693 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value"); 694 } 695 696 { 697 double r = (double) vh.compareAndExchangeAcquire(1.0d, 3.0d); 698 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double"); 699 double x = (double) vh.get(); 700 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value"); 701 } 702 703 { 704 double r = (double) vh.compareAndExchangeRelease(2.0d, 1.0d); 705 assertEquals(r, 2.0d, "success compareAndExchangeRelease double"); 706 double x = (double) vh.get(); 707 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value"); 708 } 709 710 { 711 double r = (double) vh.compareAndExchangeRelease(2.0d, 3.0d); 712 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double"); 713 double x = (double) vh.get(); 714 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value"); 715 } 716 717 { 718 boolean success = false; 719 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 720 success = vh.weakCompareAndSetPlain(1.0d, 2.0d); 721 } 722 assertEquals(success, true, "weakCompareAndSetPlain double"); 723 double x = (double) vh.get(); 724 assertEquals(x, 2.0d, "weakCompareAndSetPlain double value"); 725 } 726 727 { 728 boolean success = false; 729 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 730 success = vh.weakCompareAndSetAcquire(2.0d, 1.0d); 731 } 732 assertEquals(success, true, "weakCompareAndSetAcquire double"); 733 double x = (double) vh.get(); 734 assertEquals(x, 1.0d, "weakCompareAndSetAcquire double"); 735 } 736 737 { 738 boolean success = false; 739 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 740 success = vh.weakCompareAndSetRelease(1.0d, 2.0d); 741 } 742 assertEquals(success, true, "weakCompareAndSetRelease double"); 743 double x = (double) vh.get(); 744 assertEquals(x, 2.0d, "weakCompareAndSetRelease double"); 745 } 746 747 { 748 boolean success = false; 749 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 750 success = vh.weakCompareAndSet(2.0d, 1.0d); 751 } 752 assertEquals(success, true, "weakCompareAndSet double"); 753 double x = (double) vh.get(); 754 assertEquals(x, 1.0d, "weakCompareAndSet double"); 755 } 756 757 // Compare set and get 758 { 759 vh.set(1.0d); 760 761 double o = (double) vh.getAndSet(2.0d); 762 assertEquals(o, 1.0d, "getAndSet double"); 763 double x = (double) vh.get(); 764 assertEquals(x, 2.0d, "getAndSet double value"); 765 } 766 767 { 768 vh.set(1.0d); 769 770 double o = (double) vh.getAndSetAcquire(2.0d); 771 assertEquals(o, 1.0d, "getAndSetAcquire double"); 772 double x = (double) vh.get(); 773 assertEquals(x, 2.0d, "getAndSetAcquire double value"); 774 } 775 776 { 777 vh.set(1.0d); 778 779 double o = (double) vh.getAndSetRelease(2.0d); 780 assertEquals(o, 1.0d, "getAndSetRelease double"); 781 double x = (double) vh.get(); 782 assertEquals(x, 2.0d, "getAndSetRelease double value"); 783 } 784 785 // get and add, add and get 786 { 787 vh.set(1.0d); 788 789 double o = (double) vh.getAndAdd(2.0d); 790 assertEquals(o, 1.0d, "getAndAdd double"); 791 double x = (double) vh.get(); 792 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value"); 793 } 794 795 { 796 vh.set(1.0d); 797 798 double o = (double) vh.getAndAddAcquire(2.0d); 799 assertEquals(o, 1.0d, "getAndAddAcquire double"); 800 double x = (double) vh.get(); 801 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value"); 802 } 803 804 { 805 vh.set(1.0d); 806 807 double o = (double) vh.getAndAddRelease(2.0d); 808 assertEquals(o, 1.0d, "getAndAddReleasedouble"); 809 double x = (double) vh.get(); 810 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value"); 811 } 812 813 } 814 815 static void testStaticFieldUnsupported(VarHandle vh) { 816 817 818 checkUOE(() -> { 819 double o = (double) vh.getAndBitwiseOr(1.0d); 820 }); 821 822 checkUOE(() -> { 823 double o = (double) vh.getAndBitwiseOrAcquire(1.0d); 824 }); 825 826 checkUOE(() -> { 827 double o = (double) vh.getAndBitwiseOrRelease(1.0d); 828 }); 829 830 checkUOE(() -> { 831 double o = (double) vh.getAndBitwiseAnd(1.0d); 832 }); 833 834 checkUOE(() -> { 835 double o = (double) vh.getAndBitwiseAndAcquire(1.0d); 836 }); 837 838 checkUOE(() -> { 839 double o = (double) vh.getAndBitwiseAndRelease(1.0d); 840 }); 841 842 checkUOE(() -> { 843 double o = (double) vh.getAndBitwiseXor(1.0d); 844 }); 845 846 checkUOE(() -> { 847 double o = (double) vh.getAndBitwiseXorAcquire(1.0d); 848 }); 849 850 checkUOE(() -> { 851 double o = (double) vh.getAndBitwiseXorRelease(1.0d); 852 }); 853 } 854 855 856 static void testArray(VarHandle vh) { 857 double[] array = new double[10]; 858 859 for (int i = 0; i < array.length; i++) { 860 // Plain 861 { 862 vh.set(array, i, 1.0d); 863 double x = (double) vh.get(array, i); 864 assertEquals(x, 1.0d, "get double value"); 865 } 866 867 868 // Volatile 869 { 870 vh.setVolatile(array, i, 2.0d); 871 double x = (double) vh.getVolatile(array, i); 872 assertEquals(x, 2.0d, "setVolatile double value"); 873 } 874 875 // Lazy 876 { 877 vh.setRelease(array, i, 1.0d); 878 double x = (double) vh.getAcquire(array, i); 879 assertEquals(x, 1.0d, "setRelease double value"); 880 } 881 882 // Opaque 883 { 884 vh.setOpaque(array, i, 2.0d); 885 double x = (double) vh.getOpaque(array, i); 886 assertEquals(x, 2.0d, "setOpaque double value"); 887 } 888 889 vh.set(array, i, 1.0d); 890 891 // Compare 892 { 893 boolean r = vh.compareAndSet(array, i, 1.0d, 2.0d); 894 assertEquals(r, true, "success compareAndSet double"); 895 double x = (double) vh.get(array, i); 896 assertEquals(x, 2.0d, "success compareAndSet double value"); 897 } 898 899 { 900 boolean r = vh.compareAndSet(array, i, 1.0d, 3.0d); 901 assertEquals(r, false, "failing compareAndSet double"); 902 double x = (double) vh.get(array, i); 903 assertEquals(x, 2.0d, "failing compareAndSet double value"); 904 } 905 906 { 907 double r = (double) vh.compareAndExchange(array, i, 2.0d, 1.0d); 908 assertEquals(r, 2.0d, "success compareAndExchange double"); 909 double x = (double) vh.get(array, i); 910 assertEquals(x, 1.0d, "success compareAndExchange double value"); 911 } 912 913 { 914 double r = (double) vh.compareAndExchange(array, i, 2.0d, 3.0d); 915 assertEquals(r, 1.0d, "failing compareAndExchange double"); 916 double x = (double) vh.get(array, i); 917 assertEquals(x, 1.0d, "failing compareAndExchange double value"); 918 } 919 920 { 921 double r = (double) vh.compareAndExchangeAcquire(array, i, 1.0d, 2.0d); 922 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double"); 923 double x = (double) vh.get(array, i); 924 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value"); 925 } 926 927 { 928 double r = (double) vh.compareAndExchangeAcquire(array, i, 1.0d, 3.0d); 929 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double"); 930 double x = (double) vh.get(array, i); 931 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value"); 932 } 933 934 { 935 double r = (double) vh.compareAndExchangeRelease(array, i, 2.0d, 1.0d); 936 assertEquals(r, 2.0d, "success compareAndExchangeRelease double"); 937 double x = (double) vh.get(array, i); 938 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value"); 939 } 940 941 { 942 double r = (double) vh.compareAndExchangeRelease(array, i, 2.0d, 3.0d); 943 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double"); 944 double x = (double) vh.get(array, i); 945 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value"); 946 } 947 948 { 949 boolean success = false; 950 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 951 success = vh.weakCompareAndSetPlain(array, i, 1.0d, 2.0d); 952 } 953 assertEquals(success, true, "weakCompareAndSetPlain double"); 954 double x = (double) vh.get(array, i); 955 assertEquals(x, 2.0d, "weakCompareAndSetPlain double value"); 956 } 957 958 { 959 boolean success = false; 960 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 961 success = vh.weakCompareAndSetAcquire(array, i, 2.0d, 1.0d); 962 } 963 assertEquals(success, true, "weakCompareAndSetAcquire double"); 964 double x = (double) vh.get(array, i); 965 assertEquals(x, 1.0d, "weakCompareAndSetAcquire double"); 966 } 967 968 { 969 boolean success = false; 970 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 971 success = vh.weakCompareAndSetRelease(array, i, 1.0d, 2.0d); 972 } 973 assertEquals(success, true, "weakCompareAndSetRelease double"); 974 double x = (double) vh.get(array, i); 975 assertEquals(x, 2.0d, "weakCompareAndSetRelease double"); 976 } 977 978 { 979 boolean success = false; 980 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 981 success = vh.weakCompareAndSet(array, i, 2.0d, 1.0d); 982 } 983 assertEquals(success, true, "weakCompareAndSet double"); 984 double x = (double) vh.get(array, i); 985 assertEquals(x, 1.0d, "weakCompareAndSet double"); 986 } 987 988 // Compare set and get 989 { 990 vh.set(array, i, 1.0d); 991 992 double o = (double) vh.getAndSet(array, i, 2.0d); 993 assertEquals(o, 1.0d, "getAndSet double"); 994 double x = (double) vh.get(array, i); 995 assertEquals(x, 2.0d, "getAndSet double value"); 996 } 997 998 { 999 vh.set(array, i, 1.0d); 1000 1001 double o = (double) vh.getAndSetAcquire(array, i, 2.0d); 1002 assertEquals(o, 1.0d, "getAndSetAcquire double"); 1003 double x = (double) vh.get(array, i); 1004 assertEquals(x, 2.0d, "getAndSetAcquire double value"); 1005 } 1006 1007 { 1008 vh.set(array, i, 1.0d); 1009 1010 double o = (double) vh.getAndSetRelease(array, i, 2.0d); 1011 assertEquals(o, 1.0d, "getAndSetRelease double"); 1012 double x = (double) vh.get(array, i); 1013 assertEquals(x, 2.0d, "getAndSetRelease double value"); 1014 } 1015 1016 // get and add, add and get 1017 { 1018 vh.set(array, i, 1.0d); 1019 1020 double o = (double) vh.getAndAdd(array, i, 2.0d); 1021 assertEquals(o, 1.0d, "getAndAdd double"); 1022 double x = (double) vh.get(array, i); 1023 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value"); 1024 } 1025 1026 { 1027 vh.set(array, i, 1.0d); 1028 1029 double o = (double) vh.getAndAddAcquire(array, i, 2.0d); 1030 assertEquals(o, 1.0d, "getAndAddAcquire double"); 1031 double x = (double) vh.get(array, i); 1032 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value"); 1033 } 1034 1035 { 1036 vh.set(array, i, 1.0d); 1037 1038 double o = (double) vh.getAndAddRelease(array, i, 2.0d); 1039 assertEquals(o, 1.0d, "getAndAddReleasedouble"); 1040 double x = (double) vh.get(array, i); 1041 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value"); 1042 } 1043 1044 } 1045 } 1046 1047 static void testArrayUnsupported(VarHandle vh) { 1048 double[] array = new double[10]; 1049 1050 int i = 0; 1051 1052 1053 checkUOE(() -> { 1054 double o = (double) vh.getAndBitwiseOr(array, i, 1.0d); 1055 }); 1056 1057 checkUOE(() -> { 1058 double o = (double) vh.getAndBitwiseOrAcquire(array, i, 1.0d); 1059 }); 1060 1061 checkUOE(() -> { 1062 double o = (double) vh.getAndBitwiseOrRelease(array, i, 1.0d); 1063 }); 1064 1065 checkUOE(() -> { 1066 double o = (double) vh.getAndBitwiseAnd(array, i, 1.0d); 1067 }); 1068 1069 checkUOE(() -> { 1070 double o = (double) vh.getAndBitwiseAndAcquire(array, i, 1.0d); 1071 }); 1072 1073 checkUOE(() -> { 1074 double o = (double) vh.getAndBitwiseAndRelease(array, i, 1.0d); 1075 }); 1076 1077 checkUOE(() -> { 1078 double o = (double) vh.getAndBitwiseXor(array, i, 1.0d); 1079 }); 1080 1081 checkUOE(() -> { 1082 double o = (double) vh.getAndBitwiseXorAcquire(array, i, 1.0d); 1083 }); 1084 1085 checkUOE(() -> { 1086 double o = (double) vh.getAndBitwiseXorRelease(array, i, 1.0d); 1087 }); 1088 } 1089 1090 static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable { 1091 double[] array = new double[10]; 1092 1093 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 1094 final int ci = i; 1095 1096 checkIOOBE(() -> { 1097 double x = (double) vh.get(array, ci); 1098 }); 1099 1100 checkIOOBE(() -> { 1101 vh.set(array, ci, 1.0d); 1102 }); 1103 1104 checkIOOBE(() -> { 1105 double x = (double) vh.getVolatile(array, ci); 1106 }); 1107 1108 checkIOOBE(() -> { 1109 vh.setVolatile(array, ci, 1.0d); 1110 }); 1111 1112 checkIOOBE(() -> { 1113 double x = (double) vh.getAcquire(array, ci); 1114 }); 1115 1116 checkIOOBE(() -> { 1117 vh.setRelease(array, ci, 1.0d); 1118 }); 1119 1120 checkIOOBE(() -> { 1121 double x = (double) vh.getOpaque(array, ci); 1122 }); 1123 1124 checkIOOBE(() -> { 1125 vh.setOpaque(array, ci, 1.0d); 1126 }); 1127 1128 checkIOOBE(() -> { 1129 boolean r = vh.compareAndSet(array, ci, 1.0d, 2.0d); 1130 }); 1131 1132 checkIOOBE(() -> { 1133 double r = (double) vh.compareAndExchange(array, ci, 2.0d, 1.0d); 1134 }); 1135 1136 checkIOOBE(() -> { 1137 double r = (double) vh.compareAndExchangeAcquire(array, ci, 2.0d, 1.0d); 1138 }); 1139 1140 checkIOOBE(() -> { 1141 double r = (double) vh.compareAndExchangeRelease(array, ci, 2.0d, 1.0d); 1142 }); 1143 1144 checkIOOBE(() -> { 1145 boolean r = vh.weakCompareAndSetPlain(array, ci, 1.0d, 2.0d); 1146 }); 1147 1148 checkIOOBE(() -> { 1149 boolean r = vh.weakCompareAndSet(array, ci, 1.0d, 2.0d); 1150 }); 1151 1152 checkIOOBE(() -> { 1153 boolean r = vh.weakCompareAndSetAcquire(array, ci, 1.0d, 2.0d); 1154 }); 1155 1156 checkIOOBE(() -> { 1157 boolean r = vh.weakCompareAndSetRelease(array, ci, 1.0d, 2.0d); 1158 }); 1159 1160 checkIOOBE(() -> { 1161 double o = (double) vh.getAndSet(array, ci, 1.0d); 1162 }); 1163 1164 checkIOOBE(() -> { 1165 double o = (double) vh.getAndSetAcquire(array, ci, 1.0d); 1166 }); 1167 1168 checkIOOBE(() -> { 1169 double o = (double) vh.getAndSetRelease(array, ci, 1.0d); 1170 }); 1171 1172 checkIOOBE(() -> { 1173 double o = (double) vh.getAndAdd(array, ci, 1.0d); 1174 }); 1175 1176 checkIOOBE(() -> { 1177 double o = (double) vh.getAndAddAcquire(array, ci, 1.0d); 1178 }); 1179 1180 checkIOOBE(() -> { 1181 double o = (double) vh.getAndAddRelease(array, ci, 1.0d); 1182 }); 1183 1184 } 1185 } 1186 } 1187