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