blob: 409d700c47435e1dbdb8e9693af793e08525838b [file] [log] [blame]
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001/*
2 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @run testng/othervm -Diters=20000 VarHandleTestMethodHandleAccessDouble
27 */
28
29import org.testng.annotations.BeforeClass;
30import org.testng.annotations.DataProvider;
31import org.testng.annotations.Test;
32
33import java.lang.invoke.MethodHandles;
34import java.lang.invoke.VarHandle;
35import java.util.ArrayList;
36import java.util.Arrays;
37import java.util.List;
38
39import static org.testng.Assert.*;
40
41public class VarHandleTestMethodHandleAccessDouble extends VarHandleBaseTest {
42 static final double static_final_v = 1.0d;
43
44 static double static_v;
45
46 final double final_v = 1.0d;
47
48 double v;
49
50 VarHandle vhFinalField;
51
52 VarHandle vhField;
53
54 VarHandle vhStaticField;
55
56 VarHandle vhStaticFinalField;
57
58 VarHandle vhArray;
59
60 @BeforeClass
61 public void setup() throws Exception {
62 vhFinalField = MethodHandles.lookup().findVarHandle(
63 VarHandleTestMethodHandleAccessDouble.class, "final_v", double.class);
64
65 vhField = MethodHandles.lookup().findVarHandle(
66 VarHandleTestMethodHandleAccessDouble.class, "v", double.class);
67
68 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
69 VarHandleTestMethodHandleAccessDouble.class, "static_final_v", double.class);
70
71 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
72 VarHandleTestMethodHandleAccessDouble.class, "static_v", double.class);
73
74 vhArray = MethodHandles.arrayElementVarHandle(double[].class);
75 }
76
77
78 @DataProvider
79 public Object[][] accessTestCaseProvider() throws Exception {
80 List<AccessTestCase<?>> cases = new ArrayList<>();
81
82 for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) {
83 cases.add(new MethodHandleAccessTestCase("Instance field",
84 vhField, f, hs -> testInstanceField(this, hs)));
85 cases.add(new MethodHandleAccessTestCase("Instance field unsupported",
86 vhField, f, hs -> testInstanceFieldUnsupported(this, hs),
87 false));
88
89 cases.add(new MethodHandleAccessTestCase("Static field",
90 vhStaticField, f, VarHandleTestMethodHandleAccessDouble::testStaticField));
91 cases.add(new MethodHandleAccessTestCase("Static field unsupported",
92 vhStaticField, f, VarHandleTestMethodHandleAccessDouble::testStaticFieldUnsupported,
93 false));
94
95 cases.add(new MethodHandleAccessTestCase("Array",
96 vhArray, f, VarHandleTestMethodHandleAccessDouble::testArray));
97 cases.add(new MethodHandleAccessTestCase("Array unsupported",
98 vhArray, f, VarHandleTestMethodHandleAccessDouble::testArrayUnsupported,
99 false));
100 cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
101 vhArray, f, VarHandleTestMethodHandleAccessDouble::testArrayIndexOutOfBounds,
102 false));
103 }
104
105 // Work around issue with jtreg summary reporting which truncates
106 // the String result of Object.toString to 30 characters, hence
107 // the first dummy argument
108 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
109 }
110
111 @Test(dataProvider = "accessTestCaseProvider")
112 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
113 T t = atc.get();
114 int iters = atc.requiresLoop() ? ITERS : 1;
115 for (int c = 0; c < iters; c++) {
116 atc.testAccess(t);
117 }
118 }
119
120
121 static void testInstanceField(VarHandleTestMethodHandleAccessDouble recv, Handles hs) throws Throwable {
122 // Plain
123 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200124 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
125 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100126 assertEquals(x, 1.0d, "set double value");
127 }
128
129
130 // Volatile
131 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200132 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 2.0d);
133 double x = (double) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100134 assertEquals(x, 2.0d, "setVolatile double value");
135 }
136
137 // Lazy
138 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200139 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 1.0d);
140 double x = (double) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100141 assertEquals(x, 1.0d, "setRelease double value");
142 }
143
144 // Opaque
145 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200146 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 2.0d);
147 double x = (double) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100148 assertEquals(x, 2.0d, "setOpaque double value");
149 }
150
Paul Sandoz734dbe42016-06-20 17:57:19 +0200151 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100152
Paul Sandoz734dbe42016-06-20 17:57:19 +0200153 // Compare
154 {
155 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1.0d, 2.0d);
156 assertEquals(r, true, "success compareAndSet double");
157 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
158 assertEquals(x, 2.0d, "success compareAndSet double value");
159 }
160
161 {
162 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1.0d, 3.0d);
163 assertEquals(r, false, "failing compareAndSet double");
164 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
165 assertEquals(x, 2.0d, "failing compareAndSet double value");
166 }
167
168 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200169 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 2.0d, 1.0d);
170 assertEquals(r, 2.0d, "success compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200171 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200172 assertEquals(x, 1.0d, "success compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200173 }
174
175 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200176 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 2.0d, 3.0d);
177 assertEquals(r, 1.0d, "failing compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200178 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200179 assertEquals(x, 1.0d, "failing compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200180 }
181
182 {
183 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1.0d, 2.0d);
184 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
185 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
186 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value");
187 }
188
189 {
190 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1.0d, 3.0d);
191 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
192 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
193 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value");
194 }
195
196 {
197 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2.0d, 1.0d);
198 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
199 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
200 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value");
201 }
202
203 {
204 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2.0d, 3.0d);
205 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
206 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
207 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value");
208 }
209
210 {
211 boolean success = false;
212 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700213 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, 1.0d, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200214 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700215 assertEquals(success, true, "weakCompareAndSetPlain double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200216 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700217 assertEquals(x, 2.0d, "weakCompareAndSetPlain double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200218 }
219
220 {
221 boolean success = false;
222 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
223 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2.0d, 1.0d);
224 }
225 assertEquals(success, true, "weakCompareAndSetAcquire double");
226 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
227 assertEquals(x, 1.0d, "weakCompareAndSetAcquire double");
228 }
229
230 {
231 boolean success = false;
232 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
233 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1.0d, 2.0d);
234 }
235 assertEquals(success, true, "weakCompareAndSetRelease double");
236 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
237 assertEquals(x, 2.0d, "weakCompareAndSetRelease double");
238 }
239
240 {
241 boolean success = false;
242 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700243 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 2.0d, 1.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200244 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700245 assertEquals(success, true, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200246 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700247 assertEquals(x, 1.0d, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200248 }
249
250 // Compare set and get
251 {
252 double o = (double) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2.0d);
253 assertEquals(o, 1.0d, "getAndSet double");
254 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
255 assertEquals(x, 2.0d, "getAndSet double value");
256 }
257
Paul Sandoz734dbe42016-06-20 17:57:19 +0200258 // get and add, add and get
259 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700260 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
261
Paul Sandozc073edc2016-09-01 10:17:01 -0700262 double o = (double) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200263 assertEquals(o, 1.0d, "getAndAdd double");
Paul Sandozc073edc2016-09-01 10:17:01 -0700264 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
265 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200266 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700267
268 {
269 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
270
271 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(recv, 2.0d);
272 assertEquals(o, 1.0d, "getAndAddAcquire double");
273 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
274 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value");
275 }
276
277 {
278 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0d);
279
280 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(recv, 2.0d);
281 assertEquals(o, 1.0d, "getAndAddRelease double");
282 double x = (double) hs.get(TestAccessMode.GET).invokeExact(recv);
283 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value");
284 }
285
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100286 }
287
288 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessDouble recv, Handles hs) throws Throwable {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100289
Paul Sandoz82d48912016-09-01 10:16:57 -0700290
291 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
292 checkUOE(am, () -> {
293 double r = (double) hs.get(am).invokeExact(recv, 1.0d);
294 });
295 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100296 }
297
298
299 static void testStaticField(Handles hs) throws Throwable {
300 // Plain
301 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200302 hs.get(TestAccessMode.SET).invokeExact(1.0d);
303 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100304 assertEquals(x, 1.0d, "set double value");
305 }
306
307
308 // Volatile
309 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200310 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(2.0d);
311 double x = (double) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100312 assertEquals(x, 2.0d, "setVolatile double value");
313 }
314
315 // Lazy
316 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200317 hs.get(TestAccessMode.SET_RELEASE).invokeExact(1.0d);
318 double x = (double) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100319 assertEquals(x, 1.0d, "setRelease double value");
320 }
321
322 // Opaque
323 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200324 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(2.0d);
325 double x = (double) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100326 assertEquals(x, 2.0d, "setOpaque double value");
327 }
328
Paul Sandoz734dbe42016-06-20 17:57:19 +0200329 hs.get(TestAccessMode.SET).invokeExact(1.0d);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100330
Paul Sandoz734dbe42016-06-20 17:57:19 +0200331 // Compare
332 {
333 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1.0d, 2.0d);
334 assertEquals(r, true, "success compareAndSet double");
335 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
336 assertEquals(x, 2.0d, "success compareAndSet double value");
337 }
338
339 {
340 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1.0d, 3.0d);
341 assertEquals(r, false, "failing compareAndSet double");
342 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
343 assertEquals(x, 2.0d, "failing compareAndSet double value");
344 }
345
346 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200347 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(2.0d, 1.0d);
348 assertEquals(r, 2.0d, "success compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200349 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200350 assertEquals(x, 1.0d, "success compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200351 }
352
353 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200354 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(2.0d, 3.0d);
355 assertEquals(r, 1.0d, "failing compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200356 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200357 assertEquals(x, 1.0d, "failing compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200358 }
359
360 {
361 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1.0d, 2.0d);
362 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
363 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
364 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value");
365 }
366
367 {
368 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1.0d, 3.0d);
369 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
370 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
371 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value");
372 }
373
374 {
375 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2.0d, 1.0d);
376 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
377 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
378 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value");
379 }
380
381 {
382 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2.0d, 3.0d);
383 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
384 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
385 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value");
386 }
387
388 {
389 boolean success = false;
390 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700391 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(1.0d, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200392 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700393 assertEquals(success, true, "weakCompareAndSetPlain double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200394 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700395 assertEquals(x, 2.0d, "weakCompareAndSetPlain double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200396 }
397
398 {
399 boolean success = false;
400 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
401 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(2.0d, 1.0d);
402 }
403 assertEquals(success, true, "weakCompareAndSetAcquire double");
404 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
405 assertEquals(x, 1.0d, "weakCompareAndSetAcquire double");
406 }
407
408 {
409 boolean success = false;
410 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
411 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(1.0d, 2.0d);
412 }
413 assertEquals(success, true, "weakCompareAndSetRelease double");
414 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
415 assertEquals(x, 2.0d, "weakCompareAndSetRelease double");
416 }
417
418 {
419 boolean success = false;
420 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700421 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(2.0d, 1.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200422 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700423 assertEquals(success, true, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200424 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700425 assertEquals(x, 1.0d, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200426 }
427
428 // Compare set and get
429 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700430 hs.get(TestAccessMode.SET).invokeExact(1.0d);
431
432 double o = (double) hs.get(TestAccessMode.GET_AND_SET).invokeExact(2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200433 assertEquals(o, 1.0d, "getAndSet double");
434 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
435 assertEquals(x, 2.0d, "getAndSet double value");
436 }
437
Paul Sandoz82d48912016-09-01 10:16:57 -0700438 // Compare set and get
439 {
440 hs.get(TestAccessMode.SET).invokeExact(1.0d);
441
442 double o = (double) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(2.0d);
443 assertEquals(o, 1.0d, "getAndSetAcquire double");
444 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
445 assertEquals(x, 2.0d, "getAndSetAcquire double value");
446 }
447
448 // Compare set and get
449 {
450 hs.get(TestAccessMode.SET).invokeExact(1.0d);
451
452 double o = (double) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(2.0d);
453 assertEquals(o, 1.0d, "getAndSetRelease double");
454 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
455 assertEquals(x, 2.0d, "getAndSetRelease double value");
456 }
Paul Sandoz734dbe42016-06-20 17:57:19 +0200457
458 // get and add, add and get
459 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700460 hs.get(TestAccessMode.SET).invokeExact(1.0d);
461
Paul Sandozc073edc2016-09-01 10:17:01 -0700462 double o = (double) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200463 assertEquals(o, 1.0d, "getAndAdd double");
Paul Sandozc073edc2016-09-01 10:17:01 -0700464 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
465 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200466 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700467
468 {
469 hs.get(TestAccessMode.SET).invokeExact(1.0d);
470
471 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(2.0d);
472 assertEquals(o, 1.0d, "getAndAddAcquire double");
473 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
474 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value");
475 }
476
477 {
478 hs.get(TestAccessMode.SET).invokeExact(1.0d);
479
480 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(2.0d);
481 assertEquals(o, 1.0d, "getAndAddRelease double");
482 double x = (double) hs.get(TestAccessMode.GET).invokeExact();
483 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value");
484 }
485
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100486 }
487
488 static void testStaticFieldUnsupported(Handles hs) throws Throwable {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100489
Paul Sandoz82d48912016-09-01 10:16:57 -0700490
491 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
492 checkUOE(am, () -> {
493 double r = (double) hs.get(am).invokeExact(1.0d);
494 });
495 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100496 }
497
498
499 static void testArray(Handles hs) throws Throwable {
500 double[] array = new double[10];
501
502 for (int i = 0; i < array.length; i++) {
503 // Plain
504 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200505 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
506 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100507 assertEquals(x, 1.0d, "get double value");
508 }
509
510
511 // Volatile
512 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200513 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 2.0d);
514 double x = (double) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100515 assertEquals(x, 2.0d, "setVolatile double value");
516 }
517
518 // Lazy
519 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200520 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 1.0d);
521 double x = (double) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100522 assertEquals(x, 1.0d, "setRelease double value");
523 }
524
525 // Opaque
526 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200527 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 2.0d);
528 double x = (double) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100529 assertEquals(x, 2.0d, "setOpaque double value");
530 }
531
Paul Sandoz734dbe42016-06-20 17:57:19 +0200532 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100533
Paul Sandoz734dbe42016-06-20 17:57:19 +0200534 // Compare
535 {
536 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1.0d, 2.0d);
537 assertEquals(r, true, "success compareAndSet double");
538 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
539 assertEquals(x, 2.0d, "success compareAndSet double value");
540 }
541
542 {
543 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1.0d, 3.0d);
544 assertEquals(r, false, "failing compareAndSet double");
545 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
546 assertEquals(x, 2.0d, "failing compareAndSet double value");
547 }
548
549 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200550 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 2.0d, 1.0d);
551 assertEquals(r, 2.0d, "success compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200552 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200553 assertEquals(x, 1.0d, "success compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200554 }
555
556 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200557 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 2.0d, 3.0d);
558 assertEquals(r, 1.0d, "failing compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200559 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200560 assertEquals(x, 1.0d, "failing compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200561 }
562
563 {
564 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1.0d, 2.0d);
565 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
566 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
567 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value");
568 }
569
570 {
571 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1.0d, 3.0d);
572 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
573 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
574 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value");
575 }
576
577 {
578 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2.0d, 1.0d);
579 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
580 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
581 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value");
582 }
583
584 {
585 double r = (double) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2.0d, 3.0d);
586 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
587 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
588 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value");
589 }
590
591 {
592 boolean success = false;
593 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700594 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, 1.0d, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200595 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700596 assertEquals(success, true, "weakCompareAndSetPlain double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200597 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700598 assertEquals(x, 2.0d, "weakCompareAndSetPlain double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200599 }
600
601 {
602 boolean success = false;
603 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
604 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2.0d, 1.0d);
605 }
606 assertEquals(success, true, "weakCompareAndSetAcquire double");
607 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
608 assertEquals(x, 1.0d, "weakCompareAndSetAcquire double");
609 }
610
611 {
612 boolean success = false;
613 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
614 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 1.0d, 2.0d);
615 }
616 assertEquals(success, true, "weakCompareAndSetRelease double");
617 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
618 assertEquals(x, 2.0d, "weakCompareAndSetRelease double");
619 }
620
621 {
622 boolean success = false;
623 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700624 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 2.0d, 1.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200625 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700626 assertEquals(success, true, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200627 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700628 assertEquals(x, 1.0d, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200629 }
630
631 // Compare set and get
632 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700633 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
634
Paul Sandoz734dbe42016-06-20 17:57:19 +0200635 double o = (double) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2.0d);
636 assertEquals(o, 1.0d, "getAndSet double");
637 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
638 assertEquals(x, 2.0d, "getAndSet double value");
639 }
640
Paul Sandoz82d48912016-09-01 10:16:57 -0700641 {
642 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
643
644 double o = (double) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, 2.0d);
645 assertEquals(o, 1.0d, "getAndSetAcquire double");
646 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
647 assertEquals(x, 2.0d, "getAndSetAcquire double value");
648 }
649
650 {
651 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
652
653 double o = (double) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, 2.0d);
654 assertEquals(o, 1.0d, "getAndSetRelease double");
655 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
656 assertEquals(x, 2.0d, "getAndSetRelease double value");
657 }
Paul Sandoz734dbe42016-06-20 17:57:19 +0200658
659 // get and add, add and get
660 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700661 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
662
Paul Sandozc073edc2016-09-01 10:17:01 -0700663 double o = (double) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200664 assertEquals(o, 1.0d, "getAndAdd double");
Paul Sandozc073edc2016-09-01 10:17:01 -0700665 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
666 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200667 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700668
669 {
670 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
671
672 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(array, i, 2.0d);
673 assertEquals(o, 1.0d, "getAndAddAcquire double");
674 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
675 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value");
676 }
677
678 {
679 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0d);
680
681 double o = (double) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(array, i, 2.0d);
682 assertEquals(o, 1.0d, "getAndAddRelease double");
683 double x = (double) hs.get(TestAccessMode.GET).invokeExact(array, i);
684 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value");
685 }
686
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100687 }
688 }
689
690 static void testArrayUnsupported(Handles hs) throws Throwable {
691 double[] array = new double[10];
692
693 final int i = 0;
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100694
Paul Sandoz82d48912016-09-01 10:16:57 -0700695
696 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
697 checkUOE(am, () -> {
698 double o = (double) hs.get(am).invokeExact(array, i, 1.0d);
699 });
700 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100701 }
702
703 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
704 double[] array = new double[10];
705
706 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
707 final int ci = i;
708
Paul Sandoza7aff442016-04-13 15:05:48 +0200709 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100710 checkIOOBE(am, () -> {
711 double x = (double) hs.get(am).invokeExact(array, ci);
712 });
713 }
714
Paul Sandoza7aff442016-04-13 15:05:48 +0200715 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100716 checkIOOBE(am, () -> {
717 hs.get(am).invokeExact(array, ci, 1.0d);
718 });
719 }
720
Paul Sandoz734dbe42016-06-20 17:57:19 +0200721 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
722 checkIOOBE(am, () -> {
723 boolean r = (boolean) hs.get(am).invokeExact(array, ci, 1.0d, 2.0d);
724 });
725 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100726
Paul Sandoz734dbe42016-06-20 17:57:19 +0200727 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
728 checkIOOBE(am, () -> {
729 double r = (double) hs.get(am).invokeExact(array, ci, 2.0d, 1.0d);
730 });
731 }
732
733 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
734 checkIOOBE(am, () -> {
735 double o = (double) hs.get(am).invokeExact(array, ci, 1.0d);
736 });
737 }
738
739 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
740 checkIOOBE(am, () -> {
741 double o = (double) hs.get(am).invokeExact(array, ci, 3.0d);
742 });
743 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700744
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100745 }
746 }
747}
748