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 VarHandleTestMethodHandleAccessLong 27 */ 28 29 import org.testng.annotations.BeforeClass; 30 import org.testng.annotations.DataProvider; 31 import org.testng.annotations.Test; 32 33 import java.lang.invoke.MethodHandles; 34 import java.lang.invoke.VarHandle; 35 import java.util.ArrayList; 36 import java.util.Arrays; 37 import java.util.List; 38 39 import static org.testng.Assert.*; 40 41 public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest { 42 static final long static_final_v = 0x0123456789ABCDEFL; 43 44 static long static_v; 45 46 final long final_v = 0x0123456789ABCDEFL; 47 48 long v; 49 50 VarHandle vhFinalField; 51 52 VarHandle vhField; 53 54 VarHandle vhStaticField; 55 56 VarHandle vhStaticFinalField; 57 58 VarHandle vhArray; 59 60 @BeforeClass 61 public void setup() throws Exception { 62 vhFinalField = MethodHandles.lookup().findVarHandle( 63 VarHandleTestMethodHandleAccessLong.class, "final_v", long.class); 64 65 vhField = MethodHandles.lookup().findVarHandle( 66 VarHandleTestMethodHandleAccessLong.class, "v", long.class); 67 68 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle( 69 VarHandleTestMethodHandleAccessLong.class, "static_final_v", long.class); 70 71 vhStaticField = MethodHandles.lookup().findStaticVarHandle( 72 VarHandleTestMethodHandleAccessLong.class, "static_v", long.class); 73 74 vhArray = MethodHandles.arrayElementVarHandle(long[].class); 75 } 76 77 78 @DataProvider 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, VarHandleTestMethodHandleAccessLong::testStaticField)); 91 cases.add(new MethodHandleAccessTestCase("Static field unsupported", 92 vhStaticField, f, VarHandleTestMethodHandleAccessLong::testStaticFieldUnsupported, 93 false)); 94 95 cases.add(new MethodHandleAccessTestCase("Array", 96 vhArray, f, VarHandleTestMethodHandleAccessLong::testArray)); 97 cases.add(new MethodHandleAccessTestCase("Array unsupported", 98 vhArray, f, VarHandleTestMethodHandleAccessLong::testArrayUnsupported, 99 false)); 100 cases.add(new MethodHandleAccessTestCase("Array index out of bounds", 101 vhArray, f, VarHandleTestMethodHandleAccessLong::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") 112 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 113 T t = atc.get(); 114 int iters = atc.requiresLoop() ? ITERS : 1; 115 for (int c = 0; c < iters; c++) { 116 atc.testAccess(t); 117 } 118 } 119 120 121 static void testInstanceField(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable { 122 // Plain 123 { 124 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 125 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 126 assertEquals(x, 0x0123456789ABCDEFL, "set long value"); 127 } 128 129 130 // Volatile 131 { 132 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 133 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv); 134 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value"); 135 } 136 137 // Lazy 138 { 139 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 0x0123456789ABCDEFL); 140 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv); 141 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value"); 142 } 143 144 // Opaque 145 { 146 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 147 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv); 148 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value"); 149 } 150 151 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 152 153 // Compare 154 { 155 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 156 assertEquals(r, true, "success compareAndSet long"); 157 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 158 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value"); 159 } 160 161 { 162 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 163 assertEquals(r, false, "failing compareAndSet long"); 164 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 165 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value"); 166 } 167 168 { 169 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 170 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long"); 171 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 172 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value"); 173 } 174 175 { 176 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 177 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long"); 178 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 179 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value"); 180 } 181 182 { 183 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 184 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long"); 185 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 186 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value"); 187 } 188 189 { 190 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 191 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long"); 192 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 193 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value"); 194 } 195 196 { 197 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 198 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long"); 199 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 200 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value"); 201 } 202 203 { 204 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 205 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long"); 206 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 207 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value"); 208 } 209 210 { 211 boolean success = false; 212 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 213 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 214 } 215 assertEquals(success, true, "weakCompareAndSetPlain long"); 216 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 217 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value"); 218 } 219 220 { 221 boolean success = false; 222 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 223 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 224 } 225 assertEquals(success, true, "weakCompareAndSetAcquire long"); 226 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 227 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long"); 228 } 229 230 { 231 boolean success = false; 232 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 233 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 234 } 235 assertEquals(success, true, "weakCompareAndSetRelease long"); 236 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 237 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long"); 238 } 239 240 { 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, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 244 } 245 assertEquals(success, true, "weakCompareAndSet long"); 246 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 247 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long"); 248 } 249 250 // Compare set and get 251 { 252 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 0xCAFEBABECAFEBABEL); 253 assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long"); 254 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 255 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value"); 256 } 257 258 // get and add, add and get 259 { 260 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 261 262 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 0xCAFEBABECAFEBABEL); 263 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long"); 264 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 265 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value"); 266 } 267 268 { 269 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 270 271 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 272 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long"); 273 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 274 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value"); 275 } 276 277 { 278 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 279 280 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 281 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddRelease long"); 282 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 283 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value"); 284 } 285 286 // get and bitwise or 287 { 288 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 289 290 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(recv, 0xCAFEBABECAFEBABEL); 291 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long"); 292 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 293 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value"); 294 } 295 296 { 297 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 298 299 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 300 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long"); 301 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 302 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value"); 303 } 304 305 { 306 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 307 308 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 309 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long"); 310 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 311 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value"); 312 } 313 314 // get and bitwise and 315 { 316 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 317 318 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(recv, 0xCAFEBABECAFEBABEL); 319 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long"); 320 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 321 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value"); 322 } 323 324 { 325 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 326 327 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 328 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long"); 329 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 330 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value"); 331 } 332 333 { 334 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 335 336 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 337 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long"); 338 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 339 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value"); 340 } 341 342 // get and bitwise xor 343 { 344 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 345 346 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(recv, 0xCAFEBABECAFEBABEL); 347 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long"); 348 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 349 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value"); 350 } 351 352 { 353 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 354 355 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 356 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long"); 357 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 358 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value"); 359 } 360 361 { 362 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL); 363 364 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL); 365 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long"); 366 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); 367 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value"); 368 } 369 } 370 371 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable { 372 373 374 } 375 376 377 static void testStaticField(Handles hs) throws Throwable { 378 // Plain 379 { 380 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 381 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 382 assertEquals(x, 0x0123456789ABCDEFL, "set long value"); 383 } 384 385 386 // Volatile 387 { 388 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(0xCAFEBABECAFEBABEL); 389 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(); 390 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value"); 391 } 392 393 // Lazy 394 { 395 hs.get(TestAccessMode.SET_RELEASE).invokeExact(0x0123456789ABCDEFL); 396 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(); 397 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value"); 398 } 399 400 // Opaque 401 { 402 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(0xCAFEBABECAFEBABEL); 403 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(); 404 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value"); 405 } 406 407 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 408 409 // Compare 410 { 411 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 412 assertEquals(r, true, "success compareAndSet long"); 413 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 414 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value"); 415 } 416 417 { 418 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 419 assertEquals(r, false, "failing compareAndSet long"); 420 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 421 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value"); 422 } 423 424 { 425 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 426 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long"); 427 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 428 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value"); 429 } 430 431 { 432 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 433 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long"); 434 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 435 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value"); 436 } 437 438 { 439 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 440 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long"); 441 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 442 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value"); 443 } 444 445 { 446 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 447 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long"); 448 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 449 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value"); 450 } 451 452 { 453 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 454 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long"); 455 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 456 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value"); 457 } 458 459 { 460 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 461 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long"); 462 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 463 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value"); 464 } 465 466 { 467 boolean success = false; 468 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 469 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 470 } 471 assertEquals(success, true, "weakCompareAndSetPlain long"); 472 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 473 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value"); 474 } 475 476 { 477 boolean success = false; 478 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 479 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 480 } 481 assertEquals(success, true, "weakCompareAndSetAcquire long"); 482 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 483 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long"); 484 } 485 486 { 487 boolean success = false; 488 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 489 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 490 } 491 assertEquals(success, true, "weakCompareAndSetRelease long"); 492 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 493 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long"); 494 } 495 496 { 497 boolean success = false; 498 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 499 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 500 } 501 assertEquals(success, true, "weakCompareAndSet long"); 502 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 503 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long"); 504 } 505 506 // Compare set and get 507 { 508 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 509 510 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(0xCAFEBABECAFEBABEL); 511 assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long"); 512 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 513 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value"); 514 } 515 516 // Compare set and get 517 { 518 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 519 520 long o = (long) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL); 521 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long"); 522 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 523 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value"); 524 } 525 526 // Compare set and get 527 { 528 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 529 530 long o = (long) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(0xCAFEBABECAFEBABEL); 531 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long"); 532 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 533 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value"); 534 } 535 536 // get and add, add and get 537 { 538 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 539 540 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(0xCAFEBABECAFEBABEL); 541 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long"); 542 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 543 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value"); 544 } 545 546 { 547 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 548 549 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL); 550 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long"); 551 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 552 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value"); 553 } 554 555 { 556 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 557 558 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(0xCAFEBABECAFEBABEL); 559 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddRelease long"); 560 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 561 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value"); 562 } 563 564 // get and bitwise or 565 { 566 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 567 568 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(0xCAFEBABECAFEBABEL); 569 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long"); 570 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 571 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value"); 572 } 573 574 { 575 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 576 577 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL); 578 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long"); 579 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 580 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value"); 581 } 582 583 { 584 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 585 586 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(0xCAFEBABECAFEBABEL); 587 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long"); 588 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 589 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value"); 590 } 591 592 // get and bitwise and 593 { 594 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 595 596 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(0xCAFEBABECAFEBABEL); 597 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long"); 598 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 599 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value"); 600 } 601 602 { 603 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 604 605 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL); 606 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long"); 607 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 608 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value"); 609 } 610 611 { 612 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 613 614 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(0xCAFEBABECAFEBABEL); 615 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long"); 616 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 617 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value"); 618 } 619 620 // get and bitwise xor 621 { 622 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 623 624 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(0xCAFEBABECAFEBABEL); 625 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long"); 626 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 627 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value"); 628 } 629 630 { 631 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 632 633 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL); 634 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long"); 635 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 636 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value"); 637 } 638 639 { 640 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL); 641 642 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(0xCAFEBABECAFEBABEL); 643 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long"); 644 long x = (long) hs.get(TestAccessMode.GET).invokeExact(); 645 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value"); 646 } 647 } 648 649 static void testStaticFieldUnsupported(Handles hs) throws Throwable { 650 651 652 } 653 654 655 static void testArray(Handles hs) throws Throwable { 656 long[] array = new long[10]; 657 658 for (int i = 0; i < array.length; i++) { 659 // Plain 660 { 661 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 662 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 663 assertEquals(x, 0x0123456789ABCDEFL, "get long value"); 664 } 665 666 667 // Volatile 668 { 669 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 670 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i); 671 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value"); 672 } 673 674 // Lazy 675 { 676 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 0x0123456789ABCDEFL); 677 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i); 678 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value"); 679 } 680 681 // Opaque 682 { 683 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 684 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i); 685 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value"); 686 } 687 688 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 689 690 // Compare 691 { 692 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 693 assertEquals(r, true, "success compareAndSet long"); 694 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 695 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value"); 696 } 697 698 { 699 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 700 assertEquals(r, false, "failing compareAndSet long"); 701 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 702 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value"); 703 } 704 705 { 706 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 707 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long"); 708 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 709 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value"); 710 } 711 712 { 713 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 714 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long"); 715 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 716 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value"); 717 } 718 719 { 720 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 721 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long"); 722 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 723 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value"); 724 } 725 726 { 727 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL); 728 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long"); 729 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 730 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value"); 731 } 732 733 { 734 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 735 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long"); 736 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 737 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value"); 738 } 739 740 { 741 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL); 742 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long"); 743 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 744 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value"); 745 } 746 747 { 748 boolean success = false; 749 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 750 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 751 } 752 assertEquals(success, true, "weakCompareAndSetPlain long"); 753 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 754 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value"); 755 } 756 757 { 758 boolean success = false; 759 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 760 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 761 } 762 assertEquals(success, true, "weakCompareAndSetAcquire long"); 763 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 764 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long"); 765 } 766 767 { 768 boolean success = false; 769 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 770 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 771 } 772 assertEquals(success, true, "weakCompareAndSetRelease long"); 773 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 774 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long"); 775 } 776 777 { 778 boolean success = false; 779 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 780 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 781 } 782 assertEquals(success, true, "weakCompareAndSet long"); 783 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 784 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long"); 785 } 786 787 // Compare set and get 788 { 789 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 790 791 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 792 assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long"); 793 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 794 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value"); 795 } 796 797 { 798 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 799 800 long o = (long) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 801 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long"); 802 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 803 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value"); 804 } 805 806 { 807 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 808 809 long o = (long) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 810 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long"); 811 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 812 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value"); 813 } 814 815 // get and add, add and get 816 { 817 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 818 819 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 820 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long"); 821 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 822 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value"); 823 } 824 825 { 826 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 827 828 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 829 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long"); 830 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 831 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value"); 832 } 833 834 { 835 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 836 837 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 838 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddRelease long"); 839 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 840 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value"); 841 } 842 843 // get and bitwise or 844 { 845 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 846 847 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 848 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long"); 849 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 850 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value"); 851 } 852 853 { 854 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 855 856 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 857 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long"); 858 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 859 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value"); 860 } 861 862 { 863 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 864 865 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 866 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long"); 867 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 868 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value"); 869 } 870 871 // get and bitwise and 872 { 873 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 874 875 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 876 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long"); 877 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 878 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value"); 879 } 880 881 { 882 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 883 884 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 885 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long"); 886 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 887 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value"); 888 } 889 890 { 891 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 892 893 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 894 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long"); 895 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 896 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value"); 897 } 898 899 // get and bitwise xor 900 { 901 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 902 903 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 904 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long"); 905 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 906 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value"); 907 } 908 909 { 910 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 911 912 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 913 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long"); 914 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 915 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value"); 916 } 917 918 { 919 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL); 920 921 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL); 922 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long"); 923 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); 924 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value"); 925 } 926 } 927 } 928 929 static void testArrayUnsupported(Handles hs) throws Throwable { 930 long[] array = new long[10]; 931 932 final int i = 0; 933 934 935 } 936 937 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable { 938 long[] array = new long[10]; 939 940 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 941 final int ci = i; 942 943 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { 944 checkIOOBE(am, () -> { 945 long x = (long) hs.get(am).invokeExact(array, ci); 946 }); 947 } 948 949 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { 950 checkIOOBE(am, () -> { 951 hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL); 952 }); 953 } 954 955 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { 956 checkIOOBE(am, () -> { 957 boolean r = (boolean) hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL); 958 }); 959 } 960 961 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { 962 checkIOOBE(am, () -> { 963 long r = (long) hs.get(am).invokeExact(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL); 964 }); 965 } 966 967 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { 968 checkIOOBE(am, () -> { 969 long o = (long) hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL); 970 }); 971 } 972 973 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 974 checkIOOBE(am, () -> { 975 long o = (long) hs.get(am).invokeExact(array, ci, 0xDEADBEEFDEADBEEFL); 976 }); 977 } 978 979 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 980 checkIOOBE(am, () -> { 981 long o = (long) hs.get(am).invokeExact(array, ci, 0xDEADBEEFDEADBEEFL); 982 }); 983 } 984 } 985 } 986 } 987