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 VarHandleTestMethodHandleAccessDouble
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 VarHandleTestMethodHandleAccessDouble extends VarHandleBaseTest {
45 static final double static_final_v = 1.0d;
46
47 static double static_v;
48
49 final double final_v = 1.0d;
50
51 double 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 VarHandleTestMethodHandleAccessDouble.class, "final_v", double.class);
67
68 vhField = MethodHandles.lookup().findVarHandle(
69 VarHandleTestMethodHandleAccessDouble.class, "v", double.class);
70
71 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
72 VarHandleTestMethodHandleAccessDouble.class, "static_final_v", double.class);
73
74 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
75 VarHandleTestMethodHandleAccessDouble.class, "static_v", double.class);
76
77 vhArray = MethodHandles.arrayElementVarHandle(double[].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, VarHandleTestMethodHandleAccessDouble::testStaticField));
94 cases.add(new MethodHandleAccessTestCase("Static field unsupported",
95 vhStaticField, f, VarHandleTestMethodHandleAccessDouble::testStaticFieldUnsupported,
96 false));
97
98 cases.add(new MethodHandleAccessTestCase("Array",
99 vhArray, f, VarHandleTestMethodHandleAccessDouble::testArray));
100 cases.add(new MethodHandleAccessTestCase("Array unsupported",
101 vhArray, f, VarHandleTestMethodHandleAccessDouble::testArrayUnsupported,
102 false));
103 cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
104 vhArray, f, VarHandleTestMethodHandleAccessDouble::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(VarHandleTestMethodHandleAccessDouble recv, Handles hs) throws Throwable {
125 // Plain
126 {
127 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
128 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
129 assertEquals(x, 1.0d, "set double value");
130 }
131
132
133 // Volatile
134 {
135 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 2.0d);
136 double x = (double) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
137 assertEquals(x, 2.0d, "setVolatile double value");
138 }
139
140 // Lazy
141 {
142 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 1.0d);
143 double x = (double) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
144 assertEquals(x, 1.0d, "setRelease double value");
145 }
146
147 // Opaque
148 {
149 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 2.0d);
150 double x = (double) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
151 assertEquals(x, 2.0d, "setOpaque double value");
152 }
153
154 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
155
156 // Compare
157 {
158 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1.0d, 2.0d);
159 assertEquals(r, true, "success compareAndSet double");
160 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
161 assertEquals(x, 2.0d, "success compareAndSet double value");
162 }
163
164 {
165 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1.0d, 3.0d);
166 assertEquals(r, false, "failing compareAndSet double");
167 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
168 assertEquals(x, 2.0d, "failing compareAndSet double value");
169 }
170
171 {
172 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 2.0d, 1.0d);
173 assertEquals(r, 2.0d, "success compareAndExchange double");
174 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
175 assertEquals(x, 1.0d, "success compareAndExchange double value");
176 }
177
178 {
179 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 2.0d, 3.0d);
180 assertEquals(r, 1.0d, "failing compareAndExchange double");
181 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
182 assertEquals(x, 1.0d, "failing compareAndExchange double value");
183 }
184
185 {
186 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1.0d, 2.0d);
187 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
188 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
189 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value");
190 }
191
192 {
193 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1.0d, 3.0d);
194 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
195 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
196 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value");
197 }
198
199 {
200 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2.0d, 1.0d);
201 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
202 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
203 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value");
204 }
205
206 {
207 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2.0d, 3.0d);
208 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
209 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
210 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double 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, 1.0d, 2.0d);
218 if (!success) weakDelay();
219 }
220 assertEquals(success, true, "success weakCompareAndSetPlain double");
221 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
222 assertEquals(x, 2.0d, "success weakCompareAndSetPlain double value");
223 }
224
225 {
226 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, 1.0d, 3.0d);
227 assertEquals(success, false, "failing weakCompareAndSetPlain double");
228 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
229 assertEquals(x, 2.0d, "failing weakCompareAndSetPlain double 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, 2.0d, 1.0d);
237 if (!success) weakDelay();
238 }
239 assertEquals(success, true, "success weakCompareAndSetAcquire double");
240 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
241 assertEquals(x, 1.0d, "success weakCompareAndSetAcquire double");
242 }
243
244 {
245 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2.0d, 3.0d);
246 assertEquals(success, false, "failing weakCompareAndSetAcquire double");
247 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
248 assertEquals(x, 1.0d, "failing weakCompareAndSetAcquire double 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, 1.0d, 2.0d);
256 if (!success) weakDelay();
257 }
258 assertEquals(success, true, "success weakCompareAndSetRelease double");
259 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
260 assertEquals(x, 2.0d, "success weakCompareAndSetRelease double");
261 }
262
263 {
264 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1.0d, 3.0d);
265 assertEquals(success, false, "failing weakCompareAndSetRelease double");
266 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
267 assertEquals(x, 2.0d, "failing weakCompareAndSetRelease double 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, 2.0d, 1.0d);
275 if (!success) weakDelay();
276 }
277 assertEquals(success, true, "success weakCompareAndSet double");
278 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
279 assertEquals(x, 1.0d, "success weakCompareAndSet double");
280 }
281
282 {
283 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 2.0d, 3.0d);
284 assertEquals(success, false, "failing weakCompareAndSet double");
285 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
286 assertEquals(x, 1.0d, "failing weakCompareAndSet double value");
287 }
288
289 // Compare set and get
290 {
291 double o = (double) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2.0d);
292 assertEquals(o, 1.0d, "getAndSet double");
293 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
294 assertEquals(x, 2.0d, "getAndSet double value");
295 }
296
297 // get and add, add and get
298 {
299 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
300
301 double o = (double) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 2.0d);
302 assertEquals(o, 1.0d, "getAndAdd double");
303 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
304 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value");
305 }
306
307 {
308 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
309
310 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(recv, 2.0d);
311 assertEquals(o, 1.0d, "getAndAddAcquire double");
312 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
313 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value");
314 }
315
316 {
317 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
318
319 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(recv, 2.0d);
320 assertEquals(o, 1.0d, "getAndAddRelease double");
321 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
322 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value");
323 }
324
325 }
326
327 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessDouble recv, Handles hs) throws Throwable {
328
329
330 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
331 checkUOE(am, () -> {
332 double r = (double) hs.get(am).invokeExact(recv, 1.0d);
333 });
334 }
335 }
336
337
338 static void testStaticField(Handles hs) throws Throwable {
339 // Plain
340 {
341 hs.get(TestAccessMode.SET).invokeExact(1.0d);
342 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
343 assertEquals(x, 1.0d, "set double value");
344 }
345
346
347 // Volatile
348 {
349 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(2.0d);
350 double x = (double) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
351 assertEquals(x, 2.0d, "setVolatile double value");
352 }
353
354 // Lazy
355 {
356 hs.get(TestAccessMode.SET_RELEASE).invokeExact(1.0d);
357 double x = (double) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
358 assertEquals(x, 1.0d, "setRelease double value");
359 }
360
361 // Opaque
362 {
363 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(2.0d);
364 double x = (double) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
365 assertEquals(x, 2.0d, "setOpaque double value");
366 }
367
368 hs.get(TestAccessMode.SET).invokeExact(1.0d);
369
370 // Compare
371 {
372 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1.0d, 2.0d);
373 assertEquals(r, true, "success compareAndSet double");
374 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
375 assertEquals(x, 2.0d, "success compareAndSet double value");
376 }
377
378 {
379 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1.0d, 3.0d);
380 assertEquals(r, false, "failing compareAndSet double");
381 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
382 assertEquals(x, 2.0d, "failing compareAndSet double value");
383 }
384
385 {
386 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(2.0d, 1.0d);
387 assertEquals(r, 2.0d, "success compareAndExchange double");
388 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
389 assertEquals(x, 1.0d, "success compareAndExchange double value");
390 }
391
392 {
393 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(2.0d, 3.0d);
394 assertEquals(r, 1.0d, "failing compareAndExchange double");
395 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
396 assertEquals(x, 1.0d, "failing compareAndExchange double value");
397 }
398
399 {
400 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1.0d, 2.0d);
401 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
402 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
403 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value");
404 }
405
406 {
407 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1.0d, 3.0d);
408 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
409 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
410 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value");
411 }
412
413 {
414 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2.0d, 1.0d);
415 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
416 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
417 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value");
418 }
419
420 {
421 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2.0d, 3.0d);
422 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
423 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
424 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value");
425 }
426
427 {
428 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
429 boolean success = false;
430 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
431 success = (boolean) mh.invokeExact(1.0d, 2.0d);
432 if (!success) weakDelay();
433 }
434 assertEquals(success, true, "success weakCompareAndSetPlain double");
435 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
436 assertEquals(x, 2.0d, "success weakCompareAndSetPlain double value");
437 }
438
439 {
440 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(1.0d, 3.0d);
441 assertEquals(success, false, "failing weakCompareAndSetPlain double");
442 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
443 assertEquals(x, 2.0d, "failing weakCompareAndSetPlain double value");
444 }
445
446 {
447 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
448 boolean success = false;
449 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
450 success = (boolean) mh.invokeExact(2.0d, 1.0d);
451 if (!success) weakDelay();
452 }
453 assertEquals(success, true, "success weakCompareAndSetAcquire double");
454 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
455 assertEquals(x, 1.0d, "success weakCompareAndSetAcquire double");
456 }
457
458 {
459 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
460 boolean success = (boolean) mh.invokeExact(2.0d, 3.0d);
461 assertEquals(success, false, "failing weakCompareAndSetAcquire double");
462 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
463 assertEquals(x, 1.0d, "failing weakCompareAndSetAcquire double value");
464 }
465
466 {
467 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
468 boolean success = false;
469 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
470 success = (boolean) mh.invokeExact(1.0d, 2.0d);
471 if (!success) weakDelay();
472 }
473 assertEquals(success, true, "success weakCompareAndSetRelease double");
474 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
475 assertEquals(x, 2.0d, "success weakCompareAndSetRelease double");
476 }
477
478 {
479 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(1.0d, 3.0d);
480 assertEquals(success, false, "failing weakCompareAndSetRelease double");
481 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
482 assertEquals(x, 2.0d, "failing weakCompareAndSetRelease double value");
483 }
484
485 {
486 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
487 boolean success = false;
488 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
489 success = (boolean) mh.invokeExact(2.0d, 1.0d);
490 if (!success) weakDelay();
491 }
492 assertEquals(success, true, "success weakCompareAndSet double");
493 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
494 assertEquals(x, 1.0d, "success weakCompareAndSet double");
495 }
496
497 {
498 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(2.0d, 3.0d);
499 assertEquals(success, false, "failing weakCompareAndSet double");
500 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
501 assertEquals(x, 1.0d, "failing weakCompareAndSetRe double value");
502 }
503
504 // Compare set and get
505 {
506 hs.get(TestAccessMode.SET).invokeExact(1.0d);
507
508 double o = (double) hs.get(TestAccessMode.GET_AND_SET).invokeExact(2.0d);
509 assertEquals(o, 1.0d, "getAndSet double");
510 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
511 assertEquals(x, 2.0d, "getAndSet double value");
512 }
513
514 // Compare set and get
515 {
516 hs.get(TestAccessMode.SET).invokeExact(1.0d);
517
518 double o = (double) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(2.0d);
519 assertEquals(o, 1.0d, "getAndSetAcquire double");
520 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
521 assertEquals(x, 2.0d, "getAndSetAcquire double value");
522 }
523
524 // Compare set and get
525 {
526 hs.get(TestAccessMode.SET).invokeExact(1.0d);
527
528 double o = (double) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(2.0d);
529 assertEquals(o, 1.0d, "getAndSetRelease double");
530 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
531 assertEquals(x, 2.0d, "getAndSetRelease double value");
532 }
533
534 // get and add, add and get
535 {
536 hs.get(TestAccessMode.SET).invokeExact(1.0d);
537
538 double o = (double) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(2.0d);
539 assertEquals(o, 1.0d, "getAndAdd double");
540 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
541 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value");
542 }
543
544 {
545 hs.get(TestAccessMode.SET).invokeExact(1.0d);
546
547 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(2.0d);
548 assertEquals(o, 1.0d, "getAndAddAcquire double");
549 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
550 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value");
551 }
552
553 {
554 hs.get(TestAccessMode.SET).invokeExact(1.0d);
555
556 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(2.0d);
557 assertEquals(o, 1.0d, "getAndAddRelease double");
558 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
559 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value");
560 }
561
562 }
563
564 static void testStaticFieldUnsupported(Handles hs) throws Throwable {
565
566
567 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
568 checkUOE(am, () -> {
569 double r = (double) hs.get(am).invokeExact(1.0d);
570 });
571 }
572 }
573
574
575 static void testArray(Handles hs) throws Throwable {
576 double[] array = new double[10];
577
578 for (int i = 0; i < array.length; i++) {
579 // Plain
580 {
581 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
582 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
583 assertEquals(x, 1.0d, "get double value");
584 }
585
586
587 // Volatile
588 {
589 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 2.0d);
590 double x = (double) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
591 assertEquals(x, 2.0d, "setVolatile double value");
592 }
593
594 // Lazy
595 {
596 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 1.0d);
597 double x = (double) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
598 assertEquals(x, 1.0d, "setRelease double value");
599 }
600
601 // Opaque
602 {
603 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 2.0d);
604 double x = (double) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
605 assertEquals(x, 2.0d, "setOpaque double value");
606 }
607
608 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
609
610 // Compare
611 {
612 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1.0d, 2.0d);
613 assertEquals(r, true, "success compareAndSet double");
614 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
615 assertEquals(x, 2.0d, "success compareAndSet double value");
616 }
617
618 {
619 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1.0d, 3.0d);
620 assertEquals(r, false, "failing compareAndSet double");
621 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
622 assertEquals(x, 2.0d, "failing compareAndSet double value");
623 }
624
625 {
626 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 2.0d, 1.0d);
627 assertEquals(r, 2.0d, "success compareAndExchange double");
628 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
629 assertEquals(x, 1.0d, "success compareAndExchange double value");
630 }
631
632 {
633 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 2.0d, 3.0d);
634 assertEquals(r, 1.0d, "failing compareAndExchange double");
635 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
636 assertEquals(x, 1.0d, "failing compareAndExchange double value");
637 }
638
639 {
640 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1.0d, 2.0d);
641 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
642 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
643 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value");
644 }
645
646 {
647 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1.0d, 3.0d);
648 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
649 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
650 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value");
651 }
652
653 {
654 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2.0d, 1.0d);
655 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
656 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
657 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value");
658 }
659
660 {
661 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2.0d, 3.0d);
662 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
663 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
664 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value");
665 }
666
667 {
668 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
669 boolean success = false;
670 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
671 success = (boolean) mh.invokeExact(array, i, 1.0d, 2.0d);
672 if (!success) weakDelay();
673 }
674 assertEquals(success, true, "success weakCompareAndSetPlain double");
675 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
676 assertEquals(x, 2.0d, "success weakCompareAndSetPlain double value");
677 }
678
679 {
680 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, 1.0d, 3.0d);
681 assertEquals(success, false, "failing weakCompareAndSetPlain double");
682 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
683 assertEquals(x, 2.0d, "failing weakCompareAndSetPlain double value");
684 }
685
686 {
687 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
688 boolean success = false;
689 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
690 success = (boolean) mh.invokeExact(array, i, 2.0d, 1.0d);
691 if (!success) weakDelay();
692 }
693 assertEquals(success, true, "success weakCompareAndSetAcquire double");
694 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
695 assertEquals(x, 1.0d, "success weakCompareAndSetAcquire double");
696 }
697
698 {
699 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2.0d, 3.0d);
700 assertEquals(success, false, "failing weakCompareAndSetAcquire double");
701 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
702 assertEquals(x, 1.0d, "failing weakCompareAndSetAcquire double value");
703 }
704
705 {
706 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
707 boolean success = false;
708 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
709 success = (boolean) mh.invokeExact(array, i, 1.0d, 2.0d);
710 if (!success) weakDelay();
711 }
712 assertEquals(success, true, "success weakCompareAndSetRelease double");
713 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
714 assertEquals(x, 2.0d, "success weakCompareAndSetRelease double");
715 }
716
717 {
718 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 1.0d, 3.0d);
719 assertEquals(success, false, "failing weakCompareAndSetAcquire double");
720 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
721 assertEquals(x, 2.0d, "failing weakCompareAndSetAcquire double value");
722 }
723
724 {
725 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
726 boolean success = false;
727 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
728 success = (boolean) mh.invokeExact(array, i, 2.0d, 1.0d);
729 if (!success) weakDelay();
730 }
731 assertEquals(success, true, "success weakCompareAndSet double");
732 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
733 assertEquals(x, 1.0d, "success weakCompareAndSet double");
734 }
735
736 {
737 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 2.0d, 3.0d);
738 assertEquals(success, false, "failing weakCompareAndSet double");
739 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
740 assertEquals(x, 1.0d, "failing weakCompareAndSet double value");
741 }
742
743 // Compare set and get
744 {
745 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
746
747 double o = (double) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2.0d);
748 assertEquals(o, 1.0d, "getAndSet double");
749 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
750 assertEquals(x, 2.0d, "getAndSet double value");
751 }
752
753 {
754 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
755
756 double o = (double) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, 2.0d);
757 assertEquals(o, 1.0d, "getAndSetAcquire double");
758 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
759 assertEquals(x, 2.0d, "getAndSetAcquire double value");
760 }
761
762 {
763 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
764
765 double o = (double) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, 2.0d);
766 assertEquals(o, 1.0d, "getAndSetRelease double");
767 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
768 assertEquals(x, 2.0d, "getAndSetRelease double value");
769 }
770
771 // get and add, add and get
772 {
773 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
774
775 double o = (double) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 2.0d);
776 assertEquals(o, 1.0d, "getAndAdd double");
777 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
778 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value");
779 }
780
781 {
782 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
783
784 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(array, i, 2.0d);
785 assertEquals(o, 1.0d, "getAndAddAcquire double");
786 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
787 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value");
788 }
789
790 {
791 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
792
793 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(array, i, 2.0d);
794 assertEquals(o, 1.0d, "getAndAddRelease double");
795 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
796 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value");
797 }
798
799 }
800 }
801
802 static void testArrayUnsupported(Handles hs) throws Throwable {
803 double[] array = new double[10];
804
805 final int i = 0;
806
807
808 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
809 checkUOE(am, () -> {
810 double o = (double) hs.get(am).invokeExact(array, i, 1.0d);
811 });
812 }
813 }
814
815 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
816 double[] array = new double[10];
817
818 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
819 final int ci = i;
820
821 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
822 checkAIOOBE(am, () -> {
823 double x = (double) hs.get(am).invokeExact(array, ci);
824 });
825 }
826
827 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
828 checkAIOOBE(am, () -> {
829 hs.get(am).invokeExact(array, ci, 1.0d);
830 });
831 }
832
833 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
834 checkAIOOBE(am, () -> {
835 boolean r = (boolean) hs.get(am).invokeExact(array, ci, 1.0d, 2.0d);
836 });
837 }
838
839 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
840 checkAIOOBE(am, () -> {
841 double r = (double) hs.get(am).invokeExact(array, ci, 2.0d, 1.0d);
842 });
843 }
844
845 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
846 checkAIOOBE(am, () -> {
847 double o = (double) hs.get(am).invokeExact(array, ci, 1.0d);
848 });
849 }
850
851 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
852 checkAIOOBE(am, () -> {
853 double o = (double) hs.get(am).invokeExact(array, ci, 3.0d);
854 });
855 }
856
857 }
858 }
859 }
860
--- EOF ---