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