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