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 VarHandleTestAccessLong 27 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestAccessLong 28 * @run testng/othervm -Diters=20000 VarHandleTestAccessLong 29 * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestAccessLong 30 */ 31 32import org.testng.annotations.BeforeClass; 33import org.testng.annotations.DataProvider; 34import org.testng.annotations.Test; 35 36import java.lang.invoke.MethodHandles; 37import java.lang.invoke.VarHandle; 38import java.util.ArrayList; 39import java.util.Arrays; 40import java.util.List; 41 42import static org.testng.Assert.*; 43 44public class VarHandleTestAccessLong extends VarHandleBaseTest { 45 static final long static_final_v = 0x0123456789ABCDEFL; 46 47 static long static_v; 48 49 final long final_v = 0x0123456789ABCDEFL; 50 51 long 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 VarHandleTestAccessLong.class, "final_v", long.class); 67 68 vhField = MethodHandles.lookup().findVarHandle( 69 VarHandleTestAccessLong.class, "v", long.class); 70 71 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle( 72 VarHandleTestAccessLong.class, "static_final_v", long.class); 73 74 vhStaticField = MethodHandles.lookup().findStaticVarHandle( 75 VarHandleTestAccessLong.class, "static_v", long.class); 76 77 vhArray = MethodHandles.arrayElementVarHandle(long[].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 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR)); 119 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)); 120 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)); 121 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND)); 122 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)); 123 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)); 124 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR)); 125 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)); 126 assertTrue(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(VarHandleTestAccessLong.class)}); 134 types.add(new Object[] {vhStaticField, Arrays.asList()}); 135 types.add(new Object[] {vhArray, Arrays.asList(long[].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(), long.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 VarHandleTestAccessLong.class, "final_v", long.class); 155 }); 156 157 checkIAE("Lookup of static field to instance field", () -> { 158 MethodHandles.lookup().findStaticVarHandle( 159 VarHandleTestAccessLong.class, "v", long.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 VarHandleTestAccessLong.class, "static_final_v", long.class); 168 }); 169 170 checkIAE("Lookup of instance field to static field", () -> { 171 vhStaticField = MethodHandles.lookup().findVarHandle( 172 VarHandleTestAccessLong.class, "static_v", long.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, VarHandleTestAccessLong::testStaticFinalField)); 189 cases.add(new VarHandleAccessTestCase("Static final field unsupported", 190 vhStaticFinalField, VarHandleTestAccessLong::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, VarHandleTestAccessLong::testStaticField)); 201 cases.add(new VarHandleAccessTestCase("Static field unsupported", 202 vhStaticField, VarHandleTestAccessLong::testStaticFieldUnsupported, 203 false)); 204 205 cases.add(new VarHandleAccessTestCase("Array", 206 vhArray, VarHandleTestAccessLong::testArray)); 207 cases.add(new VarHandleAccessTestCase("Array unsupported", 208 vhArray, VarHandleTestAccessLong::testArrayUnsupported, 209 false)); 210 cases.add(new VarHandleAccessTestCase("Array index out of bounds", 211 vhArray, VarHandleTestAccessLong::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(VarHandleTestAccessLong recv, VarHandle vh) { 233 // Plain 234 { 235 long x = (long) vh.get(recv); 236 assertEquals(x, 0x0123456789ABCDEFL, "get long value"); 237 } 238 239 240 // Volatile 241 { 242 long x = (long) vh.getVolatile(recv); 243 assertEquals(x, 0x0123456789ABCDEFL, "getVolatile long value"); 244 } 245 246 // Lazy 247 { 248 long x = (long) vh.getAcquire(recv); 249 assertEquals(x, 0x0123456789ABCDEFL, "getRelease long value"); 250 } 251 252 // Opaque 253 { 254 long x = (long) vh.getOpaque(recv); 255 assertEquals(x, 0x0123456789ABCDEFL, "getOpaque long value"); 256 } 257 } 258 259 static void testInstanceFinalFieldUnsupported(VarHandleTestAccessLong recv, VarHandle vh) { 260 checkUOE(() -> { 261 vh.set(recv, 0xCAFEBABECAFEBABEL); 262 }); 263 264 checkUOE(() -> { 265 vh.setVolatile(recv, 0xCAFEBABECAFEBABEL); 266 }); 267 268 checkUOE(() -> { 269 vh.setRelease(recv, 0xCAFEBABECAFEBABEL); 270 }); 271 272 checkUOE(() -> { 273 vh.setOpaque(recv, 0xCAFEBABECAFEBABEL); 274 }); 275 276 277 278 } 279 280 281 static void testStaticFinalField(VarHandle vh) { 282 // Plain 283 { 284 long x = (long) vh.get(); 285 assertEquals(x, 0x0123456789ABCDEFL, "get long value"); 286 } 287 288 289 // Volatile 290 { 291 long x = (long) vh.getVolatile(); 292 assertEquals(x, 0x0123456789ABCDEFL, "getVolatile long value"); 293 } 294 295 // Lazy 296 { 297 long x = (long) vh.getAcquire(); 298 assertEquals(x, 0x0123456789ABCDEFL, "getRelease long value"); 299 } 300 301 // Opaque 302 { 303 long x = (long) vh.getOpaque(); 304 assertEquals(x, 0x0123456789ABCDEFL, "getOpaque long value"); 305 } 306 } 307 308 static void testStaticFinalFieldUnsupported(VarHandle vh) { 309 checkUOE(() -> { 310 vh.set(0xCAFEBABECAFEBABEL); 311 }); 312 313 checkUOE(() -> { 314 vh.setVolatile(0xCAFEBABECAFEBABEL); 315 }); 316 317 checkUOE(() -> { 318 vh.setRelease(0xCAFEBABECAFEBABEL); 319 }); 320 321 checkUOE(() -> { 322 vh.setOpaque(0xCAFEBABECAFEBABEL); 323 }); 324 325 326 327 } 328 329 330 static void testInstanceField(VarHandleTestAccessLong recv, VarHandle vh) { 331 // Plain 332 { 333 vh.set(recv, 0x0123456789ABCDEFL); 334 long x = (long) vh.get(recv); 335 assertEquals(x, 0x0123456789ABCDEFL, "set long value"); 336 } 337 338 339 // Volatile 340 { 341 vh.setVolatile(recv, 0xCAFEBABECAFEBABEL); 342 long x = (long) vh.getVolatile(recv); 343 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value"); 344 } 345 346 // Lazy 347 { 348 vh.setRelease(recv, 0x0123456789ABCDEFL); 349 long x = (long) vh.getAcquire(recv); 350 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value"); 351 } 352 353 // Opaque 354 { 355 vh.setOpaque(recv, 0xCAFEBABECAFEBABEL); 356 long x = (long) vh.getOpaque(recv); 357 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value"); 358 } 359 360 vh.set(recv, 0x0123456789ABCDEFL); 361 362 // Compare 363 { 364 boolean r = vh.compareAndSet(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 365 assertEquals(r, true, "success compareAndSet long"); 366 long x = (long) vh.get(recv); 367 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value"); 368 } 369 370 { 371 boolean r = vh.compareAndSet(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 372 assertEquals(r, false, "failing compareAndSet long"); 373 long x = (long) vh.get(recv); 374 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value"); 375 } 376 377 { 378 long r = (long) vh.compareAndExchange(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 379 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long"); 380 long x = (long) vh.get(recv); 381 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value"); 382 } 383 384 { 385 long r = (long) vh.compareAndExchange(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 386 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long"); 387 long x = (long) vh.get(recv); 388 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value"); 389 } 390 391 { 392 long r = (long) vh.compareAndExchangeAcquire(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 393 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long"); 394 long x = (long) vh.get(recv); 395 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value"); 396 } 397 398 { 399 long r = (long) vh.compareAndExchangeAcquire(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 400 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long"); 401 long x = (long) vh.get(recv); 402 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value"); 403 } 404 405 { 406 long r = (long) vh.compareAndExchangeRelease(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 407 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long"); 408 long x = (long) vh.get(recv); 409 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value"); 410 } 411 412 { 413 long r = (long) vh.compareAndExchangeRelease(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 414 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long"); 415 long x = (long) vh.get(recv); 416 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value"); 417 } 418 419 { 420 boolean success = false; 421 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 422 success = vh.weakCompareAndSetPlain(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 423 } 424 assertEquals(success, true, "weakCompareAndSetPlain long"); 425 long x = (long) vh.get(recv); 426 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value"); 427 } 428 429 { 430 boolean success = false; 431 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 432 success = vh.weakCompareAndSetAcquire(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 433 } 434 assertEquals(success, true, "weakCompareAndSetAcquire long"); 435 long x = (long) vh.get(recv); 436 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long"); 437 } 438 439 { 440 boolean success = false; 441 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 442 success = vh.weakCompareAndSetRelease(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 443 } 444 assertEquals(success, true, "weakCompareAndSetRelease long"); 445 long x = (long) vh.get(recv); 446 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long"); 447 } 448 449 { 450 boolean success = false; 451 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 452 success = vh.weakCompareAndSet(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 453 } 454 assertEquals(success, true, "weakCompareAndSet long"); 455 long x = (long) vh.get(recv); 456 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long value"); 457 } 458 459 // Compare set and get 460 { 461 vh.set(recv, 0x0123456789ABCDEFL); 462 463 long o = (long) vh.getAndSet(recv, 0xCAFEBABECAFEBABEL); 464 assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long"); 465 long x = (long) vh.get(recv); 466 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value"); 467 } 468 469 { 470 vh.set(recv, 0x0123456789ABCDEFL); 471 472 long o = (long) vh.getAndSetAcquire(recv, 0xCAFEBABECAFEBABEL); 473 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long"); 474 long x = (long) vh.get(recv); 475 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value"); 476 } 477 478 { 479 vh.set(recv, 0x0123456789ABCDEFL); 480 481 long o = (long) vh.getAndSetRelease(recv, 0xCAFEBABECAFEBABEL); 482 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long"); 483 long x = (long) vh.get(recv); 484 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value"); 485 } 486 487 // get and add, add and get 488 { 489 vh.set(recv, 0x0123456789ABCDEFL); 490 491 long o = (long) vh.getAndAdd(recv, 0xCAFEBABECAFEBABEL); 492 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long"); 493 long x = (long) vh.get(recv); 494 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value"); 495 } 496 497 { 498 vh.set(recv, 0x0123456789ABCDEFL); 499 500 long o = (long) vh.getAndAddAcquire(recv, 0xCAFEBABECAFEBABEL); 501 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long"); 502 long x = (long) vh.get(recv); 503 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value"); 504 } 505 506 { 507 vh.set(recv, 0x0123456789ABCDEFL); 508 509 long o = (long) vh.getAndAddRelease(recv, 0xCAFEBABECAFEBABEL); 510 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddReleaselong"); 511 long x = (long) vh.get(recv); 512 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value"); 513 } 514 515 // get and bitwise or 516 { 517 vh.set(recv, 0x0123456789ABCDEFL); 518 519 long o = (long) vh.getAndBitwiseOr(recv, 0xCAFEBABECAFEBABEL); 520 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long"); 521 long x = (long) vh.get(recv); 522 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value"); 523 } 524 525 { 526 vh.set(recv, 0x0123456789ABCDEFL); 527 528 long o = (long) vh.getAndBitwiseOrAcquire(recv, 0xCAFEBABECAFEBABEL); 529 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long"); 530 long x = (long) vh.get(recv); 531 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value"); 532 } 533 534 { 535 vh.set(recv, 0x0123456789ABCDEFL); 536 537 long o = (long) vh.getAndBitwiseOrRelease(recv, 0xCAFEBABECAFEBABEL); 538 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long"); 539 long x = (long) vh.get(recv); 540 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value"); 541 } 542 543 // get and bitwise and 544 { 545 vh.set(recv, 0x0123456789ABCDEFL); 546 547 long o = (long) vh.getAndBitwiseAnd(recv, 0xCAFEBABECAFEBABEL); 548 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long"); 549 long x = (long) vh.get(recv); 550 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value"); 551 } 552 553 { 554 vh.set(recv, 0x0123456789ABCDEFL); 555 556 long o = (long) vh.getAndBitwiseAndAcquire(recv, 0xCAFEBABECAFEBABEL); 557 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long"); 558 long x = (long) vh.get(recv); 559 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value"); 560 } 561 562 { 563 vh.set(recv, 0x0123456789ABCDEFL); 564 565 long o = (long) vh.getAndBitwiseAndRelease(recv, 0xCAFEBABECAFEBABEL); 566 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long"); 567 long x = (long) vh.get(recv); 568 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value"); 569 } 570 571 // get and bitwise xor 572 { 573 vh.set(recv, 0x0123456789ABCDEFL); 574 575 long o = (long) vh.getAndBitwiseXor(recv, 0xCAFEBABECAFEBABEL); 576 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long"); 577 long x = (long) vh.get(recv); 578 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value"); 579 } 580 581 { 582 vh.set(recv, 0x0123456789ABCDEFL); 583 584 long o = (long) vh.getAndBitwiseXorAcquire(recv, 0xCAFEBABECAFEBABEL); 585 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long"); 586 long x = (long) vh.get(recv); 587 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value"); 588 } 589 590 { 591 vh.set(recv, 0x0123456789ABCDEFL); 592 593 long o = (long) vh.getAndBitwiseXorRelease(recv, 0xCAFEBABECAFEBABEL); 594 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long"); 595 long x = (long) vh.get(recv); 596 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value"); 597 } 598 } 599 600 static void testInstanceFieldUnsupported(VarHandleTestAccessLong recv, VarHandle vh) { 601 602 603 } 604 605 606 static void testStaticField(VarHandle vh) { 607 // Plain 608 { 609 vh.set(0x0123456789ABCDEFL); 610 long x = (long) vh.get(); 611 assertEquals(x, 0x0123456789ABCDEFL, "set long value"); 612 } 613 614 615 // Volatile 616 { 617 vh.setVolatile(0xCAFEBABECAFEBABEL); 618 long x = (long) vh.getVolatile(); 619 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value"); 620 } 621 622 // Lazy 623 { 624 vh.setRelease(0x0123456789ABCDEFL); 625 long x = (long) vh.getAcquire(); 626 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value"); 627 } 628 629 // Opaque 630 { 631 vh.setOpaque(0xCAFEBABECAFEBABEL); 632 long x = (long) vh.getOpaque(); 633 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value"); 634 } 635 636 vh.set(0x0123456789ABCDEFL); 637 638 // Compare 639 { 640 boolean r = vh.compareAndSet(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 641 assertEquals(r, true, "success compareAndSet long"); 642 long x = (long) vh.get(); 643 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value"); 644 } 645 646 { 647 boolean r = vh.compareAndSet(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 648 assertEquals(r, false, "failing compareAndSet long"); 649 long x = (long) vh.get(); 650 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value"); 651 } 652 653 { 654 long r = (long) vh.compareAndExchange(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 655 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long"); 656 long x = (long) vh.get(); 657 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value"); 658 } 659 660 { 661 long r = (long) vh.compareAndExchange(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 662 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long"); 663 long x = (long) vh.get(); 664 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value"); 665 } 666 667 { 668 long r = (long) vh.compareAndExchangeAcquire(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 669 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long"); 670 long x = (long) vh.get(); 671 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value"); 672 } 673 674 { 675 long r = (long) vh.compareAndExchangeAcquire(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 676 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long"); 677 long x = (long) vh.get(); 678 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value"); 679 } 680 681 { 682 long r = (long) vh.compareAndExchangeRelease(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 683 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long"); 684 long x = (long) vh.get(); 685 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value"); 686 } 687 688 { 689 long r = (long) vh.compareAndExchangeRelease(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 690 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long"); 691 long x = (long) vh.get(); 692 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value"); 693 } 694 695 { 696 boolean success = false; 697 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 698 success = vh.weakCompareAndSetPlain(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 699 } 700 assertEquals(success, true, "weakCompareAndSetPlain long"); 701 long x = (long) vh.get(); 702 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value"); 703 } 704 705 { 706 boolean success = false; 707 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 708 success = vh.weakCompareAndSetAcquire(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 709 } 710 assertEquals(success, true, "weakCompareAndSetAcquire long"); 711 long x = (long) vh.get(); 712 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long"); 713 } 714 715 { 716 boolean success = false; 717 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 718 success = vh.weakCompareAndSetRelease(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 719 } 720 assertEquals(success, true, "weakCompareAndSetRelease long"); 721 long x = (long) vh.get(); 722 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long"); 723 } 724 725 { 726 boolean success = false; 727 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 728 success = vh.weakCompareAndSet(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 729 } 730 assertEquals(success, true, "weakCompareAndSet long"); 731 long x = (long) vh.get(); 732 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long"); 733 } 734 735 // Compare set and get 736 { 737 vh.set(0x0123456789ABCDEFL); 738 739 long o = (long) vh.getAndSet(0xCAFEBABECAFEBABEL); 740 assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long"); 741 long x = (long) vh.get(); 742 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value"); 743 } 744 745 { 746 vh.set(0x0123456789ABCDEFL); 747 748 long o = (long) vh.getAndSetAcquire(0xCAFEBABECAFEBABEL); 749 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long"); 750 long x = (long) vh.get(); 751 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value"); 752 } 753 754 { 755 vh.set(0x0123456789ABCDEFL); 756 757 long o = (long) vh.getAndSetRelease(0xCAFEBABECAFEBABEL); 758 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long"); 759 long x = (long) vh.get(); 760 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value"); 761 } 762 763 // get and add, add and get 764 { 765 vh.set(0x0123456789ABCDEFL); 766 767 long o = (long) vh.getAndAdd(0xCAFEBABECAFEBABEL); 768 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long"); 769 long x = (long) vh.get(); 770 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value"); 771 } 772 773 { 774 vh.set(0x0123456789ABCDEFL); 775 776 long o = (long) vh.getAndAddAcquire(0xCAFEBABECAFEBABEL); 777 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long"); 778 long x = (long) vh.get(); 779 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value"); 780 } 781 782 { 783 vh.set(0x0123456789ABCDEFL); 784 785 long o = (long) vh.getAndAddRelease(0xCAFEBABECAFEBABEL); 786 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddReleaselong"); 787 long x = (long) vh.get(); 788 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value"); 789 } 790 791 // get and bitwise or 792 { 793 vh.set(0x0123456789ABCDEFL); 794 795 long o = (long) vh.getAndBitwiseOr(0xCAFEBABECAFEBABEL); 796 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long"); 797 long x = (long) vh.get(); 798 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value"); 799 } 800 801 { 802 vh.set(0x0123456789ABCDEFL); 803 804 long o = (long) vh.getAndBitwiseOrAcquire(0xCAFEBABECAFEBABEL); 805 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long"); 806 long x = (long) vh.get(); 807 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value"); 808 } 809 810 { 811 vh.set(0x0123456789ABCDEFL); 812 813 long o = (long) vh.getAndBitwiseOrRelease(0xCAFEBABECAFEBABEL); 814 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long"); 815 long x = (long) vh.get(); 816 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value"); 817 } 818 819 // get and bitwise and 820 { 821 vh.set(0x0123456789ABCDEFL); 822 823 long o = (long) vh.getAndBitwiseAnd(0xCAFEBABECAFEBABEL); 824 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long"); 825 long x = (long) vh.get(); 826 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value"); 827 } 828 829 { 830 vh.set(0x0123456789ABCDEFL); 831 832 long o = (long) vh.getAndBitwiseAndAcquire(0xCAFEBABECAFEBABEL); 833 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long"); 834 long x = (long) vh.get(); 835 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value"); 836 } 837 838 { 839 vh.set(0x0123456789ABCDEFL); 840 841 long o = (long) vh.getAndBitwiseAndRelease(0xCAFEBABECAFEBABEL); 842 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long"); 843 long x = (long) vh.get(); 844 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value"); 845 } 846 847 // get and bitwise xor 848 { 849 vh.set(0x0123456789ABCDEFL); 850 851 long o = (long) vh.getAndBitwiseXor(0xCAFEBABECAFEBABEL); 852 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long"); 853 long x = (long) vh.get(); 854 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value"); 855 } 856 857 { 858 vh.set(0x0123456789ABCDEFL); 859 860 long o = (long) vh.getAndBitwiseXorAcquire(0xCAFEBABECAFEBABEL); 861 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long"); 862 long x = (long) vh.get(); 863 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value"); 864 } 865 866 { 867 vh.set(0x0123456789ABCDEFL); 868 869 long o = (long) vh.getAndBitwiseXorRelease(0xCAFEBABECAFEBABEL); 870 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long"); 871 long x = (long) vh.get(); 872 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value"); 873 } 874 } 875 876 static void testStaticFieldUnsupported(VarHandle vh) { 877 878 879 } 880 881 882 static void testArray(VarHandle vh) { 883 long[] array = new long[10]; 884 885 for (int i = 0; i < array.length; i++) { 886 // Plain 887 { 888 vh.set(array, i, 0x0123456789ABCDEFL); 889 long x = (long) vh.get(array, i); 890 assertEquals(x, 0x0123456789ABCDEFL, "get long value"); 891 } 892 893 894 // Volatile 895 { 896 vh.setVolatile(array, i, 0xCAFEBABECAFEBABEL); 897 long x = (long) vh.getVolatile(array, i); 898 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value"); 899 } 900 901 // Lazy 902 { 903 vh.setRelease(array, i, 0x0123456789ABCDEFL); 904 long x = (long) vh.getAcquire(array, i); 905 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value"); 906 } 907 908 // Opaque 909 { 910 vh.setOpaque(array, i, 0xCAFEBABECAFEBABEL); 911 long x = (long) vh.getOpaque(array, i); 912 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value"); 913 } 914 915 vh.set(array, i, 0x0123456789ABCDEFL); 916 917 // Compare 918 { 919 boolean r = vh.compareAndSet(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 920 assertEquals(r, true, "success compareAndSet long"); 921 long x = (long) vh.get(array, i); 922 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value"); 923 } 924 925 { 926 boolean r = vh.compareAndSet(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 927 assertEquals(r, false, "failing compareAndSet long"); 928 long x = (long) vh.get(array, i); 929 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value"); 930 } 931 932 { 933 long r = (long) vh.compareAndExchange(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 934 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long"); 935 long x = (long) vh.get(array, i); 936 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value"); 937 } 938 939 { 940 long r = (long) vh.compareAndExchange(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 941 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long"); 942 long x = (long) vh.get(array, i); 943 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value"); 944 } 945 946 { 947 long r = (long) vh.compareAndExchangeAcquire(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 948 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long"); 949 long x = (long) vh.get(array, i); 950 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value"); 951 } 952 953 { 954 long r = (long) vh.compareAndExchangeAcquire(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 955 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long"); 956 long x = (long) vh.get(array, i); 957 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value"); 958 } 959 960 { 961 long r = (long) vh.compareAndExchangeRelease(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 962 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long"); 963 long x = (long) vh.get(array, i); 964 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value"); 965 } 966 967 { 968 long r = (long) vh.compareAndExchangeRelease(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 969 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long"); 970 long x = (long) vh.get(array, i); 971 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value"); 972 } 973 974 { 975 boolean success = false; 976 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 977 success = vh.weakCompareAndSetPlain(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 978 } 979 assertEquals(success, true, "weakCompareAndSetPlain long"); 980 long x = (long) vh.get(array, i); 981 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value"); 982 } 983 984 { 985 boolean success = false; 986 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 987 success = vh.weakCompareAndSetAcquire(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 988 } 989 assertEquals(success, true, "weakCompareAndSetAcquire long"); 990 long x = (long) vh.get(array, i); 991 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long"); 992 } 993 994 { 995 boolean success = false; 996 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 997 success = vh.weakCompareAndSetRelease(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 998 } 999 assertEquals(success, true, "weakCompareAndSetRelease long"); 1000 long x = (long) vh.get(array, i); 1001 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long"); 1002 } 1003 1004 { 1005 boolean success = false; 1006 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 1007 success = vh.weakCompareAndSet(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 1008 } 1009 assertEquals(success, true, "weakCompareAndSet long"); 1010 long x = (long) vh.get(array, i); 1011 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long"); 1012 } 1013 1014 // Compare set and get 1015 { 1016 vh.set(array, i, 0x0123456789ABCDEFL); 1017 1018 long o = (long) vh.getAndSet(array, i, 0xCAFEBABECAFEBABEL); 1019 assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long"); 1020 long x = (long) vh.get(array, i); 1021 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value"); 1022 } 1023 1024 { 1025 vh.set(array, i, 0x0123456789ABCDEFL); 1026 1027 long o = (long) vh.getAndSetAcquire(array, i, 0xCAFEBABECAFEBABEL); 1028 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long"); 1029 long x = (long) vh.get(array, i); 1030 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value"); 1031 } 1032 1033 { 1034 vh.set(array, i, 0x0123456789ABCDEFL); 1035 1036 long o = (long) vh.getAndSetRelease(array, i, 0xCAFEBABECAFEBABEL); 1037 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long"); 1038 long x = (long) vh.get(array, i); 1039 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value"); 1040 } 1041 1042 // get and add, add and get 1043 { 1044 vh.set(array, i, 0x0123456789ABCDEFL); 1045 1046 long o = (long) vh.getAndAdd(array, i, 0xCAFEBABECAFEBABEL); 1047 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long"); 1048 long x = (long) vh.get(array, i); 1049 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value"); 1050 } 1051 1052 { 1053 vh.set(array, i, 0x0123456789ABCDEFL); 1054 1055 long o = (long) vh.getAndAddAcquire(array, i, 0xCAFEBABECAFEBABEL); 1056 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long"); 1057 long x = (long) vh.get(array, i); 1058 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value"); 1059 } 1060 1061 { 1062 vh.set(array, i, 0x0123456789ABCDEFL); 1063 1064 long o = (long) vh.getAndAddRelease(array, i, 0xCAFEBABECAFEBABEL); 1065 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddReleaselong"); 1066 long x = (long) vh.get(array, i); 1067 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value"); 1068 } 1069 1070 // get and bitwise or 1071 { 1072 vh.set(array, i, 0x0123456789ABCDEFL); 1073 1074 long o = (long) vh.getAndBitwiseOr(array, i, 0xCAFEBABECAFEBABEL); 1075 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long"); 1076 long x = (long) vh.get(array, i); 1077 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value"); 1078 } 1079 1080 { 1081 vh.set(array, i, 0x0123456789ABCDEFL); 1082 1083 long o = (long) vh.getAndBitwiseOrAcquire(array, i, 0xCAFEBABECAFEBABEL); 1084 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long"); 1085 long x = (long) vh.get(array, i); 1086 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value"); 1087 } 1088 1089 { 1090 vh.set(array, i, 0x0123456789ABCDEFL); 1091 1092 long o = (long) vh.getAndBitwiseOrRelease(array, i, 0xCAFEBABECAFEBABEL); 1093 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long"); 1094 long x = (long) vh.get(array, i); 1095 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value"); 1096 } 1097 1098 // get and bitwise and 1099 { 1100 vh.set(array, i, 0x0123456789ABCDEFL); 1101 1102 long o = (long) vh.getAndBitwiseAnd(array, i, 0xCAFEBABECAFEBABEL); 1103 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long"); 1104 long x = (long) vh.get(array, i); 1105 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value"); 1106 } 1107 1108 { 1109 vh.set(array, i, 0x0123456789ABCDEFL); 1110 1111 long o = (long) vh.getAndBitwiseAndAcquire(array, i, 0xCAFEBABECAFEBABEL); 1112 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long"); 1113 long x = (long) vh.get(array, i); 1114 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value"); 1115 } 1116 1117 { 1118 vh.set(array, i, 0x0123456789ABCDEFL); 1119 1120 long o = (long) vh.getAndBitwiseAndRelease(array, i, 0xCAFEBABECAFEBABEL); 1121 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long"); 1122 long x = (long) vh.get(array, i); 1123 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value"); 1124 } 1125 1126 // get and bitwise xor 1127 { 1128 vh.set(array, i, 0x0123456789ABCDEFL); 1129 1130 long o = (long) vh.getAndBitwiseXor(array, i, 0xCAFEBABECAFEBABEL); 1131 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long"); 1132 long x = (long) vh.get(array, i); 1133 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value"); 1134 } 1135 1136 { 1137 vh.set(array, i, 0x0123456789ABCDEFL); 1138 1139 long o = (long) vh.getAndBitwiseXorAcquire(array, i, 0xCAFEBABECAFEBABEL); 1140 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long"); 1141 long x = (long) vh.get(array, i); 1142 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value"); 1143 } 1144 1145 { 1146 vh.set(array, i, 0x0123456789ABCDEFL); 1147 1148 long o = (long) vh.getAndBitwiseXorRelease(array, i, 0xCAFEBABECAFEBABEL); 1149 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long"); 1150 long x = (long) vh.get(array, i); 1151 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value"); 1152 } 1153 } 1154 } 1155 1156 static void testArrayUnsupported(VarHandle vh) { 1157 long[] array = new long[10]; 1158 1159 int i = 0; 1160 1161 1162 } 1163 1164 static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable { 1165 long[] array = new long[10]; 1166 1167 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 1168 final int ci = i; 1169 1170 checkIOOBE(() -> { 1171 long x = (long) vh.get(array, ci); 1172 }); 1173 1174 checkIOOBE(() -> { 1175 vh.set(array, ci, 0x0123456789ABCDEFL); 1176 }); 1177 1178 checkIOOBE(() -> { 1179 long x = (long) vh.getVolatile(array, ci); 1180 }); 1181 1182 checkIOOBE(() -> { 1183 vh.setVolatile(array, ci, 0x0123456789ABCDEFL); 1184 }); 1185 1186 checkIOOBE(() -> { 1187 long x = (long) vh.getAcquire(array, ci); 1188 }); 1189 1190 checkIOOBE(() -> { 1191 vh.setRelease(array, ci, 0x0123456789ABCDEFL); 1192 }); 1193 1194 checkIOOBE(() -> { 1195 long x = (long) vh.getOpaque(array, ci); 1196 }); 1197 1198 checkIOOBE(() -> { 1199 vh.setOpaque(array, ci, 0x0123456789ABCDEFL); 1200 }); 1201 1202 checkIOOBE(() -> { 1203 boolean r = vh.compareAndSet(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 1204 }); 1205 1206 checkIOOBE(() -> { 1207 long r = (long) vh.compareAndExchange(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 1208 }); 1209 1210 checkIOOBE(() -> { 1211 long r = (long) vh.compareAndExchangeAcquire(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 1212 }); 1213 1214 checkIOOBE(() -> { 1215 long r = (long) vh.compareAndExchangeRelease(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 1216 }); 1217 1218 checkIOOBE(() -> { 1219 boolean r = vh.weakCompareAndSetPlain(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 1220 }); 1221 1222 checkIOOBE(() -> { 1223 boolean r = vh.weakCompareAndSet(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 1224 }); 1225 1226 checkIOOBE(() -> { 1227 boolean r = vh.weakCompareAndSetAcquire(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 1228 }); 1229 1230 checkIOOBE(() -> { 1231 boolean r = vh.weakCompareAndSetRelease(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 1232 }); 1233 1234 checkIOOBE(() -> { 1235 long o = (long) vh.getAndSet(array, ci, 0x0123456789ABCDEFL); 1236 }); 1237 1238 checkIOOBE(() -> { 1239 long o = (long) vh.getAndSetAcquire(array, ci, 0x0123456789ABCDEFL); 1240 }); 1241 1242 checkIOOBE(() -> { 1243 long o = (long) vh.getAndSetRelease(array, ci, 0x0123456789ABCDEFL); 1244 }); 1245 1246 checkIOOBE(() -> { 1247 long o = (long) vh.getAndAdd(array, ci, 0x0123456789ABCDEFL); 1248 }); 1249 1250 checkIOOBE(() -> { 1251 long o = (long) vh.getAndAddAcquire(array, ci, 0x0123456789ABCDEFL); 1252 }); 1253 1254 checkIOOBE(() -> { 1255 long o = (long) vh.getAndAddRelease(array, ci, 0x0123456789ABCDEFL); 1256 }); 1257 1258 checkIOOBE(() -> { 1259 long o = (long) vh.getAndBitwiseOr(array, ci, 0x0123456789ABCDEFL); 1260 }); 1261 1262 checkIOOBE(() -> { 1263 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, 0x0123456789ABCDEFL); 1264 }); 1265 1266 checkIOOBE(() -> { 1267 long o = (long) vh.getAndBitwiseOrRelease(array, ci, 0x0123456789ABCDEFL); 1268 }); 1269 1270 checkIOOBE(() -> { 1271 long o = (long) vh.getAndBitwiseAnd(array, ci, 0x0123456789ABCDEFL); 1272 }); 1273 1274 checkIOOBE(() -> { 1275 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, 0x0123456789ABCDEFL); 1276 }); 1277 1278 checkIOOBE(() -> { 1279 long o = (long) vh.getAndBitwiseAndRelease(array, ci, 0x0123456789ABCDEFL); 1280 }); 1281 1282 checkIOOBE(() -> { 1283 long o = (long) vh.getAndBitwiseXor(array, ci, 0x0123456789ABCDEFL); 1284 }); 1285 1286 checkIOOBE(() -> { 1287 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, 0x0123456789ABCDEFL); 1288 }); 1289 1290 checkIOOBE(() -> { 1291 long o = (long) vh.getAndBitwiseXorRelease(array, ci, 0x0123456789ABCDEFL); 1292 }); 1293 } 1294 } 1295} 1296 1297