22 */ 23 24 /* 25 * @test 26 * @run testng/othervm -Diters=20000 VarHandleTestMethodHandleAccessLong 27 */ 28 29 import org.testng.annotations.BeforeClass; 30 import org.testng.annotations.DataProvider; 31 import org.testng.annotations.Test; 32 33 import java.lang.invoke.MethodHandles; 34 import java.lang.invoke.VarHandle; 35 import java.util.ArrayList; 36 import java.util.Arrays; 37 import java.util.List; 38 39 import static org.testng.Assert.*; 40 41 public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest { 42 static final long static_final_v = 1L; 43 44 static long static_v; 45 46 final long final_v = 1L; 47 48 long v; 49 50 VarHandle vhFinalField; 51 52 VarHandle vhField; 53 54 VarHandle vhStaticField; 55 56 VarHandle vhStaticFinalField; 57 58 VarHandle vhArray; 59 60 @BeforeClass 61 public void setup() throws Exception { 62 vhFinalField = MethodHandles.lookup().findVarHandle( 63 VarHandleTestMethodHandleAccessLong.class, "final_v", long.class); 64 65 vhField = MethodHandles.lookup().findVarHandle( 66 VarHandleTestMethodHandleAccessLong.class, "v", long.class); 104 105 // Work around issue with jtreg summary reporting which truncates 106 // the String result of Object.toString to 30 characters, hence 107 // the first dummy argument 108 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new); 109 } 110 111 @Test(dataProvider = "accessTestCaseProvider") 112 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 113 T t = atc.get(); 114 int iters = atc.requiresLoop() ? ITERS : 1; 115 for (int c = 0; c < iters; c++) { 116 atc.testAccess(t); 117 } 118 } 119 120 121 static void testInstanceField(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable { 122 // Plain 123 { 124 hs.get(TestAccessMode.SET).invokeExact(recv, 1L); 125 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 126 assertEquals(x, 1L, "set long value"); 127 } 128 129 130 // Volatile 131 { 132 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 2L); 133 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv); 134 assertEquals(x, 2L, "setVolatile long value"); 135 } 136 137 // Lazy 138 { 139 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 1L); 140 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv); 141 assertEquals(x, 1L, "setRelease long value"); 142 } 143 144 // Opaque 145 { 146 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 2L); 147 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv); 148 assertEquals(x, 2L, "setOpaque long value"); 149 } 150 151 hs.get(TestAccessMode.SET).invokeExact(recv, 1L); 152 153 // Compare 154 { 155 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1L, 2L); 156 assertEquals(r, true, "success compareAndSet long"); 157 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 158 assertEquals(x, 2L, "success compareAndSet long value"); 159 } 160 161 { 162 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1L, 3L); 163 assertEquals(r, false, "failing compareAndSet long"); 164 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 165 assertEquals(x, 2L, "failing compareAndSet long value"); 166 } 167 168 { 169 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(recv, 2L, 1L); 170 assertEquals(r, 2L, "success compareAndExchangeVolatile long"); 171 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 172 assertEquals(x, 1L, "success compareAndExchangeVolatile long value"); 173 } 174 175 { 176 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(recv, 2L, 3L); 177 assertEquals(r, 1L, "failing compareAndExchangeVolatile long"); 178 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 179 assertEquals(x, 1L, "failing compareAndExchangeVolatile long value"); 180 } 181 182 { 183 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1L, 2L); 184 assertEquals(r, 1L, "success compareAndExchangeAcquire long"); 185 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 186 assertEquals(x, 2L, "success compareAndExchangeAcquire long value"); 187 } 188 189 { 190 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1L, 3L); 191 assertEquals(r, 2L, "failing compareAndExchangeAcquire long"); 192 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 193 assertEquals(x, 2L, "failing compareAndExchangeAcquire long value"); 194 } 195 196 { 197 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2L, 1L); 198 assertEquals(r, 2L, "success compareAndExchangeRelease long"); 199 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 200 assertEquals(x, 1L, "success compareAndExchangeRelease long value"); 201 } 202 203 { 204 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2L, 3L); 205 assertEquals(r, 1L, "failing compareAndExchangeRelease long"); 206 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 207 assertEquals(x, 1L, "failing compareAndExchangeRelease long value"); 208 } 209 210 { 211 boolean success = false; 212 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 213 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 1L, 2L); 214 } 215 assertEquals(success, true, "weakCompareAndSet long"); 216 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 217 assertEquals(x, 2L, "weakCompareAndSet long value"); 218 } 219 220 { 221 boolean success = false; 222 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 223 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2L, 1L); 224 } 225 assertEquals(success, true, "weakCompareAndSetAcquire long"); 226 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 227 assertEquals(x, 1L, "weakCompareAndSetAcquire long"); 228 } 229 230 { 231 boolean success = false; 232 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 233 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1L, 2L); 234 } 235 assertEquals(success, true, "weakCompareAndSetRelease long"); 236 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 237 assertEquals(x, 2L, "weakCompareAndSetRelease long"); 238 } 239 240 // Compare set and get 241 { 242 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 1L); 243 assertEquals(o, 2L, "getAndSet long"); 244 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 245 assertEquals(x, 1L, "getAndSet long value"); 246 } 247 248 hs.get(TestAccessMode.SET).invokeExact(recv, 1L); 249 250 // get and add, add and get 251 { 252 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 3L); 253 assertEquals(o, 1L, "getAndAdd long"); 254 long c = (long) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(recv, 3L); 255 assertEquals(c, 1L + 3L + 3L, "getAndAdd long value"); 256 } 257 } 258 259 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable { 260 261 } 262 263 264 static void testStaticField(Handles hs) throws Throwable { 265 // Plain 266 { 267 hs.get(TestAccessMode.SET).invokeExact(1L); 268 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 269 assertEquals(x, 1L, "set long value"); 270 } 271 272 273 // Volatile 274 { 275 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(2L); 276 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(); 277 assertEquals(x, 2L, "setVolatile long value"); 278 } 279 280 // Lazy 281 { 282 hs.get(TestAccessMode.SET_RELEASE).invokeExact(1L); 283 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(); 284 assertEquals(x, 1L, "setRelease long value"); 285 } 286 287 // Opaque 288 { 289 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(2L); 290 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(); 291 assertEquals(x, 2L, "setOpaque long value"); 292 } 293 294 hs.get(TestAccessMode.SET).invokeExact(1L); 295 296 // Compare 297 { 298 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1L, 2L); 299 assertEquals(r, true, "success compareAndSet long"); 300 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 301 assertEquals(x, 2L, "success compareAndSet long value"); 302 } 303 304 { 305 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1L, 3L); 306 assertEquals(r, false, "failing compareAndSet long"); 307 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 308 assertEquals(x, 2L, "failing compareAndSet long value"); 309 } 310 311 { 312 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(2L, 1L); 313 assertEquals(r, 2L, "success compareAndExchangeVolatile long"); 314 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 315 assertEquals(x, 1L, "success compareAndExchangeVolatile long value"); 316 } 317 318 { 319 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(2L, 3L); 320 assertEquals(r, 1L, "failing compareAndExchangeVolatile long"); 321 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 322 assertEquals(x, 1L, "failing compareAndExchangeVolatile long value"); 323 } 324 325 { 326 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1L, 2L); 327 assertEquals(r, 1L, "success compareAndExchangeAcquire long"); 328 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 329 assertEquals(x, 2L, "success compareAndExchangeAcquire long value"); 330 } 331 332 { 333 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1L, 3L); 334 assertEquals(r, 2L, "failing compareAndExchangeAcquire long"); 335 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 336 assertEquals(x, 2L, "failing compareAndExchangeAcquire long value"); 337 } 338 339 { 340 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2L, 1L); 341 assertEquals(r, 2L, "success compareAndExchangeRelease long"); 342 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 343 assertEquals(x, 1L, "success compareAndExchangeRelease long value"); 344 } 345 346 { 347 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2L, 3L); 348 assertEquals(r, 1L, "failing compareAndExchangeRelease long"); 349 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 350 assertEquals(x, 1L, "failing compareAndExchangeRelease long value"); 351 } 352 353 { 354 boolean success = false; 355 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 356 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(1L, 2L); 357 } 358 assertEquals(success, true, "weakCompareAndSet long"); 359 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 360 assertEquals(x, 2L, "weakCompareAndSet long value"); 361 } 362 363 { 364 boolean success = false; 365 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 366 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(2L, 1L); 367 } 368 assertEquals(success, true, "weakCompareAndSetAcquire long"); 369 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 370 assertEquals(x, 1L, "weakCompareAndSetAcquire long"); 371 } 372 373 { 374 boolean success = false; 375 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 376 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(1L, 2L); 377 } 378 assertEquals(success, true, "weakCompareAndSetRelease long"); 379 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 380 assertEquals(x, 2L, "weakCompareAndSetRelease long"); 381 } 382 383 // Compare set and get 384 { 385 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 1L); 386 assertEquals(o, 2L, "getAndSet long"); 387 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 388 assertEquals(x, 1L, "getAndSet long value"); 389 } 390 391 hs.get(TestAccessMode.SET).invokeExact(1L); 392 393 // get and add, add and get 394 { 395 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact( 3L); 396 assertEquals(o, 1L, "getAndAdd long"); 397 long c = (long) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(3L); 398 assertEquals(c, 1L + 3L + 3L, "getAndAdd long value"); 399 } 400 } 401 402 static void testStaticFieldUnsupported(Handles hs) throws Throwable { 403 404 } 405 406 407 static void testArray(Handles hs) throws Throwable { 408 long[] array = new long[10]; 409 410 for (int i = 0; i < array.length; i++) { 411 // Plain 412 { 413 hs.get(TestAccessMode.SET).invokeExact(array, i, 1L); 414 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 415 assertEquals(x, 1L, "get long value"); 416 } 417 418 419 // Volatile 420 { 421 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 2L); 422 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i); 423 assertEquals(x, 2L, "setVolatile long value"); 424 } 425 426 // Lazy 427 { 428 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 1L); 429 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i); 430 assertEquals(x, 1L, "setRelease long value"); 431 } 432 433 // Opaque 434 { 435 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 2L); 436 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i); 437 assertEquals(x, 2L, "setOpaque long value"); 438 } 439 440 hs.get(TestAccessMode.SET).invokeExact(array, i, 1L); 441 442 // Compare 443 { 444 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1L, 2L); 445 assertEquals(r, true, "success compareAndSet long"); 446 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 447 assertEquals(x, 2L, "success compareAndSet long value"); 448 } 449 450 { 451 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1L, 3L); 452 assertEquals(r, false, "failing compareAndSet long"); 453 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 454 assertEquals(x, 2L, "failing compareAndSet long value"); 455 } 456 457 { 458 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(array, i, 2L, 1L); 459 assertEquals(r, 2L, "success compareAndExchangeVolatile long"); 460 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 461 assertEquals(x, 1L, "success compareAndExchangeVolatile long value"); 462 } 463 464 { 465 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(array, i, 2L, 3L); 466 assertEquals(r, 1L, "failing compareAndExchangeVolatile long"); 467 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 468 assertEquals(x, 1L, "failing compareAndExchangeVolatile long value"); 469 } 470 471 { 472 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1L, 2L); 473 assertEquals(r, 1L, "success compareAndExchangeAcquire long"); 474 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 475 assertEquals(x, 2L, "success compareAndExchangeAcquire long value"); 476 } 477 478 { 479 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1L, 3L); 480 assertEquals(r, 2L, "failing compareAndExchangeAcquire long"); 481 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 482 assertEquals(x, 2L, "failing compareAndExchangeAcquire long value"); 483 } 484 485 { 486 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2L, 1L); 487 assertEquals(r, 2L, "success compareAndExchangeRelease long"); 488 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 489 assertEquals(x, 1L, "success compareAndExchangeRelease long value"); 490 } 491 492 { 493 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2L, 3L); 494 assertEquals(r, 1L, "failing compareAndExchangeRelease long"); 495 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 496 assertEquals(x, 1L, "failing compareAndExchangeRelease long value"); 497 } 498 499 { 500 boolean success = false; 501 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 502 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 1L, 2L); 503 } 504 assertEquals(success, true, "weakCompareAndSet long"); 505 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 506 assertEquals(x, 2L, "weakCompareAndSet long value"); 507 } 508 509 { 510 boolean success = false; 511 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 512 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2L, 1L); 513 } 514 assertEquals(success, true, "weakCompareAndSetAcquire long"); 515 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 516 assertEquals(x, 1L, "weakCompareAndSetAcquire long"); 517 } 518 519 { 520 boolean success = false; 521 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 522 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 1L, 2L); 523 } 524 assertEquals(success, true, "weakCompareAndSetRelease long"); 525 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 526 assertEquals(x, 2L, "weakCompareAndSetRelease long"); 527 } 528 529 // Compare set and get 530 { 531 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 1L); 532 assertEquals(o, 2L, "getAndSet long"); 533 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 534 assertEquals(x, 1L, "getAndSet long value"); 535 } 536 537 hs.get(TestAccessMode.SET).invokeExact(array, i, 1L); 538 539 // get and add, add and get 540 { 541 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 3L); 542 assertEquals(o, 1L, "getAndAdd long"); 543 long c = (long) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(array, i, 3L); 544 assertEquals(c, 1L + 3L + 3L, "getAndAdd long value"); 545 } 546 } 547 } 548 549 static void testArrayUnsupported(Handles hs) throws Throwable { 550 long[] array = new long[10]; 551 552 final int i = 0; 553 554 } 555 556 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable { 557 long[] array = new long[10]; 558 559 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 560 final int ci = i; 561 562 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { 563 checkIOOBE(am, () -> { 564 long x = (long) hs.get(am).invokeExact(array, ci); 565 }); 566 } 567 568 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { 569 checkIOOBE(am, () -> { 570 hs.get(am).invokeExact(array, ci, 1L); 571 }); 572 } 573 574 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { 575 checkIOOBE(am, () -> { 576 boolean r = (boolean) hs.get(am).invokeExact(array, ci, 1L, 2L); 577 }); 578 } 579 580 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { 581 checkIOOBE(am, () -> { 582 long r = (long) hs.get(am).invokeExact(array, ci, 2L, 1L); 583 }); 584 } 585 586 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { 587 checkIOOBE(am, () -> { 588 long o = (long) hs.get(am).invokeExact(array, ci, 1L); 589 }); 590 } 591 592 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 593 checkIOOBE(am, () -> { 594 long o = (long) hs.get(am).invokeExact(array, ci, 3L); 595 }); 596 } 597 } 598 } 599 } 600 | 22 */ 23 24 /* 25 * @test 26 * @run testng/othervm -Diters=20000 VarHandleTestMethodHandleAccessLong 27 */ 28 29 import org.testng.annotations.BeforeClass; 30 import org.testng.annotations.DataProvider; 31 import org.testng.annotations.Test; 32 33 import java.lang.invoke.MethodHandles; 34 import java.lang.invoke.VarHandle; 35 import java.util.ArrayList; 36 import java.util.Arrays; 37 import java.util.List; 38 39 import static org.testng.Assert.*; 40 41 public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest { 42 static final long static_final_v = 0x0123456789ABCDEFL; 43 44 static long static_v; 45 46 final long final_v = 0x0123456789ABCDEFL; 47 48 long v; 49 50 VarHandle vhFinalField; 51 52 VarHandle vhField; 53 54 VarHandle vhStaticField; 55 56 VarHandle vhStaticFinalField; 57 58 VarHandle vhArray; 59 60 @BeforeClass 61 public void setup() throws Exception { 62 vhFinalField = MethodHandles.lookup().findVarHandle( 63 VarHandleTestMethodHandleAccessLong.class, "final_v", long.class); 64 65 vhField = MethodHandles.lookup().findVarHandle( 66 VarHandleTestMethodHandleAccessLong.class, "v", long.class); 104 105 // Work around issue with jtreg summary reporting which truncates 106 // the String result of Object.toString to 30 characters, hence 107 // the first dummy argument 108 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new); 109 } 110 111 @Test(dataProvider = "accessTestCaseProvider") 112 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 113 T t = atc.get(); 114 int iters = atc.requiresLoop() ? ITERS : 1; 115 for (int c = 0; c < iters; c++) { 116 atc.testAccess(t); 117 } 118 } 119 120 121 static void testInstanceField(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable { 122 // Plain 123 { 124 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 125 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 126 assertEquals(x, 0x0123456789ABCDEFL, "set long value"); 127 } 128 129 130 // Volatile 131 { 132 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 133 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv); 134 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value"); 135 } 136 137 // Lazy 138 { 139 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 0x0123456789ABCDEFL); 140 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv); 141 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value"); 142 } 143 144 // Opaque 145 { 146 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 147 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv); 148 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value"); 149 } 150 151 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 152 153 // Compare 154 { 155 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 156 assertEquals(r, true, "success compareAndSet long"); 157 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 158 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value"); 159 } 160 161 { 162 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 163 assertEquals(r, false, "failing compareAndSet long"); 164 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 165 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value"); 166 } 167 168 { 169 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 170 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeVolatile long"); 171 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 172 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeVolatile long value"); 173 } 174 175 { 176 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 177 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeVolatile long"); 178 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 179 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeVolatile long value"); 180 } 181 182 { 183 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 184 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long"); 185 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 186 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value"); 187 } 188 189 { 190 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 191 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long"); 192 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 193 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value"); 194 } 195 196 { 197 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 198 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long"); 199 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 200 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value"); 201 } 202 203 { 204 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 205 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long"); 206 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 207 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value"); 208 } 209 210 { 211 boolean success = false; 212 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 213 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 214 } 215 assertEquals(success, true, "weakCompareAndSet long"); 216 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 217 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSet long value"); 218 } 219 220 { 221 boolean success = false; 222 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 223 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 224 } 225 assertEquals(success, true, "weakCompareAndSetAcquire long"); 226 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 227 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long"); 228 } 229 230 { 231 boolean success = false; 232 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 233 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 234 } 235 assertEquals(success, true, "weakCompareAndSetRelease long"); 236 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 237 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long"); 238 } 239 240 // Compare set and get 241 { 242 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL); 243 assertEquals(o, 0xCAFEBABECAFEBABEL, "getAndSet long"); 244 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 245 assertEquals(x, 0x0123456789ABCDEFL, "getAndSet long value"); 246 } 247 248 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 249 250 // get and add, add and get 251 { 252 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 0xDEADBEEFDEADBEEFL); 253 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long"); 254 long c = (long) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(recv, 0xDEADBEEFDEADBEEFL); 255 assertEquals(c, (long)(0x0123456789ABCDEFL + 0xDEADBEEFDEADBEEFL + 0xDEADBEEFDEADBEEFL), "getAndAdd long value"); 256 } 257 } 258 259 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable { 260 261 } 262 263 264 static void testStaticField(Handles hs) throws Throwable { 265 // Plain 266 { 267 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 268 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 269 assertEquals(x, 0x0123456789ABCDEFL, "set long value"); 270 } 271 272 273 // Volatile 274 { 275 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(0xCAFEBABECAFEBABEL); 276 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(); 277 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value"); 278 } 279 280 // Lazy 281 { 282 hs.get(TestAccessMode.SET_RELEASE).invokeExact(0x0123456789ABCDEFL); 283 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(); 284 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value"); 285 } 286 287 // Opaque 288 { 289 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(0xCAFEBABECAFEBABEL); 290 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(); 291 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value"); 292 } 293 294 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 295 296 // Compare 297 { 298 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 299 assertEquals(r, true, "success compareAndSet long"); 300 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 301 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value"); 302 } 303 304 { 305 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 306 assertEquals(r, false, "failing compareAndSet long"); 307 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 308 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value"); 309 } 310 311 { 312 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 313 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeVolatile long"); 314 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 315 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeVolatile long value"); 316 } 317 318 { 319 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 320 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeVolatile long"); 321 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 322 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeVolatile long value"); 323 } 324 325 { 326 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 327 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long"); 328 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 329 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value"); 330 } 331 332 { 333 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 334 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long"); 335 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 336 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value"); 337 } 338 339 { 340 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 341 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long"); 342 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 343 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value"); 344 } 345 346 { 347 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 348 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long"); 349 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 350 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value"); 351 } 352 353 { 354 boolean success = false; 355 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 356 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 357 } 358 assertEquals(success, true, "weakCompareAndSet long"); 359 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 360 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSet long value"); 361 } 362 363 { 364 boolean success = false; 365 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 366 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 367 } 368 assertEquals(success, true, "weakCompareAndSetAcquire long"); 369 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 370 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long"); 371 } 372 373 { 374 boolean success = false; 375 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 376 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 377 } 378 assertEquals(success, true, "weakCompareAndSetRelease long"); 379 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 380 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long"); 381 } 382 383 // Compare set and get 384 { 385 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 0x0123456789ABCDEFL); 386 assertEquals(o, 0xCAFEBABECAFEBABEL, "getAndSet long"); 387 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 388 assertEquals(x, 0x0123456789ABCDEFL, "getAndSet long value"); 389 } 390 391 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 392 393 // get and add, add and get 394 { 395 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact( 0xDEADBEEFDEADBEEFL); 396 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long"); 397 long c = (long) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(0xDEADBEEFDEADBEEFL); 398 assertEquals(c, (long)(0x0123456789ABCDEFL + 0xDEADBEEFDEADBEEFL + 0xDEADBEEFDEADBEEFL), "getAndAdd long value"); 399 } 400 } 401 402 static void testStaticFieldUnsupported(Handles hs) throws Throwable { 403 404 } 405 406 407 static void testArray(Handles hs) throws Throwable { 408 long[] array = new long[10]; 409 410 for (int i = 0; i < array.length; i++) { 411 // Plain 412 { 413 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 414 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 415 assertEquals(x, 0x0123456789ABCDEFL, "get long value"); 416 } 417 418 419 // Volatile 420 { 421 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 422 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i); 423 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value"); 424 } 425 426 // Lazy 427 { 428 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 0x0123456789ABCDEFL); 429 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i); 430 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value"); 431 } 432 433 // Opaque 434 { 435 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 436 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i); 437 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value"); 438 } 439 440 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 441 442 // Compare 443 { 444 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 445 assertEquals(r, true, "success compareAndSet long"); 446 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 447 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value"); 448 } 449 450 { 451 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 452 assertEquals(r, false, "failing compareAndSet long"); 453 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 454 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value"); 455 } 456 457 { 458 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 459 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeVolatile long"); 460 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 461 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeVolatile long value"); 462 } 463 464 { 465 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 466 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeVolatile long"); 467 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 468 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeVolatile long value"); 469 } 470 471 { 472 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 473 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long"); 474 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 475 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value"); 476 } 477 478 { 479 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 480 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long"); 481 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 482 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value"); 483 } 484 485 { 486 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 487 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long"); 488 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 489 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value"); 490 } 491 492 { 493 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 494 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long"); 495 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 496 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value"); 497 } 498 499 { 500 boolean success = false; 501 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 502 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 503 } 504 assertEquals(success, true, "weakCompareAndSet long"); 505 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 506 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSet long value"); 507 } 508 509 { 510 boolean success = false; 511 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 512 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 513 } 514 assertEquals(success, true, "weakCompareAndSetAcquire long"); 515 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 516 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long"); 517 } 518 519 { 520 boolean success = false; 521 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 522 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 523 } 524 assertEquals(success, true, "weakCompareAndSetRelease long"); 525 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 526 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long"); 527 } 528 529 // Compare set and get 530 { 531 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL); 532 assertEquals(o, 0xCAFEBABECAFEBABEL, "getAndSet long"); 533 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 534 assertEquals(x, 0x0123456789ABCDEFL, "getAndSet long value"); 535 } 536 537 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 538 539 // get and add, add and get 540 { 541 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 0xDEADBEEFDEADBEEFL); 542 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long"); 543 long c = (long) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(array, i, 0xDEADBEEFDEADBEEFL); 544 assertEquals(c, (long)(0x0123456789ABCDEFL + 0xDEADBEEFDEADBEEFL + 0xDEADBEEFDEADBEEFL), "getAndAdd long value"); 545 } 546 } 547 } 548 549 static void testArrayUnsupported(Handles hs) throws Throwable { 550 long[] array = new long[10]; 551 552 final int i = 0; 553 554 } 555 556 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable { 557 long[] array = new long[10]; 558 559 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 560 final int ci = i; 561 562 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { 563 checkIOOBE(am, () -> { 564 long x = (long) hs.get(am).invokeExact(array, ci); 565 }); 566 } 567 568 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { 569 checkIOOBE(am, () -> { 570 hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL); 571 }); 572 } 573 574 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { 575 checkIOOBE(am, () -> { 576 boolean r = (boolean) hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 577 }); 578 } 579 580 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { 581 checkIOOBE(am, () -> { 582 long r = (long) hs.get(am).invokeExact(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 583 }); 584 } 585 586 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { 587 checkIOOBE(am, () -> { 588 long o = (long) hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL); 589 }); 590 } 591 592 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 593 checkIOOBE(am, () -> { 594 long o = (long) hs.get(am).invokeExact(array, ci, 0xDEADBEEFDEADBEEFL); 595 }); 596 } 597 } 598 } 599 } 600 |