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