blob: a94c0f5280b2846b1b301f14811f52e8b91c79cc [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
Paul Sandoz1af28062016-04-26 18:30:00 -070026 * @bug 8154556
Paul Sandoz9fb30a32016-03-24 11:21:21 +010027 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsLong
28 * @run testng/othervm -Diters=20000 VarHandleTestByteArrayAsLong
29 * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAsLong
30 */
31
32import org.testng.annotations.DataProvider;
33import org.testng.annotations.Test;
34
35import java.lang.invoke.MethodHandles;
36import java.lang.invoke.VarHandle;
37import java.nio.ByteBuffer;
38import java.nio.ByteOrder;
39import java.util.ArrayList;
40import java.util.Arrays;
41import java.util.EnumSet;
42import java.util.List;
43
44import static org.testng.Assert.*;
45
46public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest {
47 static final int SIZE = Long.BYTES;
48
49 static final long VALUE_1 = 0x0102030405060708L;
50
51 static final long VALUE_2 = 0x1112131415161718L;
52
Paul Sandoz0bad4452016-05-18 18:46:14 +020053 static final long VALUE_3 = 0xFFFEFDFCFBFAF9F8L;
Paul Sandoz9fb30a32016-03-24 11:21:21 +010054
55
56 @Override
57 public void setupVarHandleSources() {
58 // Combinations of VarHandle byte[] or ByteBuffer
59 vhss = new ArrayList<>();
60 for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) {
Paul Sandoz1af28062016-04-26 18:30:00 -070061
62 ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN
63 ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
Paul Sandoz9fb30a32016-03-24 11:21:21 +010064 VarHandleSource aeh = new VarHandleSource(
Paul Sandoz1af28062016-04-26 18:30:00 -070065 MethodHandles.byteArrayViewVarHandle(long[].class, bo),
Paul Sandoz9fb30a32016-03-24 11:21:21 +010066 endianess, MemoryMode.READ_WRITE);
67 vhss.add(aeh);
68
69 VarHandleSource bbh = new VarHandleSource(
Paul Sandoz1af28062016-04-26 18:30:00 -070070 MethodHandles.byteBufferViewVarHandle(long[].class, bo),
Paul Sandoz9fb30a32016-03-24 11:21:21 +010071 endianess, MemoryMode.READ_WRITE);
72 vhss.add(bbh);
73 }
74 }
75
76
77 @Test(dataProvider = "varHandlesProvider")
78 public void testIsAccessModeSupported(VarHandleSource vhs) {
79 VarHandle vh = vhs.s;
80
Paul Sandoza7aff442016-04-13 15:05:48 +020081 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET));
82 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
Paul Sandoz9fb30a32016-03-24 11:21:21 +010083
Paul Sandoza7aff442016-04-13 15:05:48 +020084 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE));
85 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE));
86 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE));
87 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE));
88 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE));
89 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +010090
Paul Sandoza7aff442016-04-13 15:05:48 +020091 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET));
Paul Sandoz3f0273a2016-06-23 13:46:48 +020092 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE));
Paul Sandoza7aff442016-04-13 15:05:48 +020093 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
94 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
95 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
Paul Sandoze9556602016-04-29 13:46:19 -070096 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
Paul Sandoza7aff442016-04-13 15:05:48 +020097 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
98 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
Paul Sandoza7aff442016-04-13 15:05:48 +020099 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
Paul Sandoz82d48912016-09-01 10:16:57 -0700100 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE));
101 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100102
Paul Sandoza7aff442016-04-13 15:05:48 +0200103 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
Paul Sandoz82d48912016-09-01 10:16:57 -0700104 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE));
105 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE));
Paul Sandoz82d48912016-09-01 10:16:57 -0700106
107 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR));
108 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE));
109 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE));
110 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND));
111 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE));
112 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE));
113 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR));
114 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE));
115 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100116 }
117
118 @Test(dataProvider = "typesProvider")
119 public void testTypes(VarHandle vh, List<java.lang.Class<?>> pts) {
120 assertEquals(vh.varType(), long.class);
121
122 assertEquals(vh.coordinateTypes(), pts);
123
124 testTypes(vh);
125 }
126
127
128 @DataProvider
129 public Object[][] accessTestCaseProvider() throws Exception {
130 List<AccessTestCase<?>> cases = new ArrayList<>();
131
132 for (ByteArrayViewSource<?> bav : bavss) {
133 for (VarHandleSource vh : vhss) {
134 if (vh.matches(bav)) {
135 if (bav instanceof ByteArraySource) {
136 ByteArraySource bas = (ByteArraySource) bav;
137
138 cases.add(new VarHandleSourceAccessTestCase(
139 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
140 true));
141 cases.add(new VarHandleSourceAccessTestCase(
142 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
143 false));
144 cases.add(new VarHandleSourceAccessTestCase(
145 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bas, h),
146 false));
147 cases.add(new VarHandleSourceAccessTestCase(
148 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bas, h),
149 false));
150 }
151 else {
152 ByteBufferSource bbs = (ByteBufferSource) bav;
153
154 if (MemoryMode.READ_WRITE.isSet(bav.memoryModes)) {
155 cases.add(new VarHandleSourceAccessTestCase(
156 "read write", bav, vh, h -> testArrayReadWrite(bbs, h),
157 true));
158 }
159 else {
160 cases.add(new VarHandleSourceAccessTestCase(
161 "read only", bav, vh, h -> testArrayReadOnly(bbs, h),
162 true));
163 }
164
165 cases.add(new VarHandleSourceAccessTestCase(
166 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
167 false));
168 cases.add(new VarHandleSourceAccessTestCase(
169 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bbs, h),
170 false));
171 cases.add(new VarHandleSourceAccessTestCase(
172 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bbs, h),
173 false));
174 }
175 }
176 }
177 }
178
179 // Work around issue with jtreg summary reporting which truncates
180 // the String result of Object.toString to 30 characters, hence
181 // the first dummy argument
182 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
183 }
184
185 @Test(dataProvider = "accessTestCaseProvider")
186 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
187 T t = atc.get();
188 int iters = atc.requiresLoop() ? ITERS : 1;
189 for (int c = 0; c < iters; c++) {
190 atc.testAccess(t);
191 }
192 }
193
194
195 static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
196 VarHandle vh = vhs.s;
197 byte[] array = bs.s;
198 int ci = 1;
199
200
Paul Sandoz82d48912016-09-01 10:16:57 -0700201
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100202 }
203
204 static void testArrayUnsupported(ByteBufferSource bs, VarHandleSource vhs) {
205 VarHandle vh = vhs.s;
206 ByteBuffer array = bs.s;
207 int ci = 0;
208 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
209
210 if (readOnly) {
211 checkROBE(() -> {
212 vh.set(array, ci, VALUE_1);
213 });
214 }
215
216 if (readOnly) {
217 checkROBE(() -> {
218 vh.setVolatile(array, ci, VALUE_1);
219 });
220
221 checkROBE(() -> {
222 vh.setRelease(array, ci, VALUE_1);
223 });
224
225 checkROBE(() -> {
226 vh.setOpaque(array, ci, VALUE_1);
227 });
228
229 checkROBE(() -> {
230 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
231 });
232
233 checkROBE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200234 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100235 });
236
237 checkROBE(() -> {
238 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
239 });
240
241 checkROBE(() -> {
242 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
243 });
244
245 checkROBE(() -> {
246 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
247 });
248
249 checkROBE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700250 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
251 });
252
253 checkROBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100254 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
255 });
256
257 checkROBE(() -> {
258 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
259 });
260
261 checkROBE(() -> {
262 long o = (long) vh.getAndSet(array, ci, VALUE_1);
263 });
Paul Sandoz44afe202016-05-17 12:06:41 +0200264
Paul Sandoz82d48912016-09-01 10:16:57 -0700265 checkROBE(() -> {
266 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
267 });
268
269 checkROBE(() -> {
270 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
271 });
272
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100273
274 checkROBE(() -> {
275 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
276 });
277
278 checkROBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700279 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
280 });
281
282 checkROBE(() -> {
283 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
284 });
285
286 checkROBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700287 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
288 });
289
290 checkROBE(() -> {
291 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
292 });
293
294 checkROBE(() -> {
295 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
296 });
297
298 checkROBE(() -> {
299 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
300 });
301
302 checkROBE(() -> {
303 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
304 });
305
306 checkROBE(() -> {
307 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
308 });
309
310 checkROBE(() -> {
311 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
312 });
313
314 checkROBE(() -> {
315 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
316 });
317
318 checkROBE(() -> {
319 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
320 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100321 }
322 else {
323 }
324 }
325
326
327 static void testArrayIndexOutOfBounds(ByteArraySource bs, VarHandleSource vhs) throws Throwable {
328 VarHandle vh = vhs.s;
329 byte[] array = bs.s;
330
331 int length = array.length - SIZE + 1;
332 for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) {
333 final int ci = i;
334
335 checkIOOBE(() -> {
336 long x = (long) vh.get(array, ci);
337 });
338
339 checkIOOBE(() -> {
340 vh.set(array, ci, VALUE_1);
341 });
342
343 checkIOOBE(() -> {
344 long x = (long) vh.getVolatile(array, ci);
345 });
346
347 checkIOOBE(() -> {
348 long x = (long) vh.getAcquire(array, ci);
349 });
350
351 checkIOOBE(() -> {
352 long x = (long) vh.getOpaque(array, ci);
353 });
354
355 checkIOOBE(() -> {
356 vh.setVolatile(array, ci, VALUE_1);
357 });
358
359 checkIOOBE(() -> {
360 vh.setRelease(array, ci, VALUE_1);
361 });
362
363 checkIOOBE(() -> {
364 vh.setOpaque(array, ci, VALUE_1);
365 });
366
367 checkIOOBE(() -> {
368 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
369 });
370
371 checkIOOBE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200372 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100373 });
374
375 checkIOOBE(() -> {
376 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
377 });
378
379 checkIOOBE(() -> {
380 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
381 });
382
383 checkIOOBE(() -> {
384 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
385 });
386
387 checkIOOBE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700388 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
389 });
390
391 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100392 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
393 });
394
395 checkIOOBE(() -> {
396 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
397 });
398
399 checkIOOBE(() -> {
400 long o = (long) vh.getAndSet(array, ci, VALUE_1);
401 });
402
403 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700404 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
405 });
406
407 checkIOOBE(() -> {
408 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
409 });
410
411 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100412 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
413 });
414
415 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700416 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
417 });
418
419 checkIOOBE(() -> {
420 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
421 });
422
423 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700424 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
425 });
426
427 checkIOOBE(() -> {
428 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
429 });
430
431 checkIOOBE(() -> {
432 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
433 });
434
435 checkIOOBE(() -> {
436 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
437 });
438
439 checkIOOBE(() -> {
440 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
441 });
442
443 checkIOOBE(() -> {
444 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
445 });
446
447 checkIOOBE(() -> {
448 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
449 });
450
451 checkIOOBE(() -> {
452 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
453 });
454
455 checkIOOBE(() -> {
456 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
457 });
458
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100459 }
460 }
461
462 static void testArrayIndexOutOfBounds(ByteBufferSource bs, VarHandleSource vhs) throws Throwable {
463 VarHandle vh = vhs.s;
464 ByteBuffer array = bs.s;
465
466 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
467
468 int length = array.limit() - SIZE + 1;
469 for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) {
470 final int ci = i;
471
472 checkIOOBE(() -> {
473 long x = (long) vh.get(array, ci);
474 });
475
476 if (!readOnly) {
477 checkIOOBE(() -> {
478 vh.set(array, ci, VALUE_1);
479 });
480 }
481
482 checkIOOBE(() -> {
483 long x = (long) vh.getVolatile(array, ci);
484 });
485
486 checkIOOBE(() -> {
487 long x = (long) vh.getAcquire(array, ci);
488 });
489
490 checkIOOBE(() -> {
491 long x = (long) vh.getOpaque(array, ci);
492 });
493
494 if (!readOnly) {
495 checkIOOBE(() -> {
496 vh.setVolatile(array, ci, VALUE_1);
497 });
498
499 checkIOOBE(() -> {
500 vh.setRelease(array, ci, VALUE_1);
501 });
502
503 checkIOOBE(() -> {
504 vh.setOpaque(array, ci, VALUE_1);
505 });
506
507 checkIOOBE(() -> {
508 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
509 });
510
511 checkIOOBE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200512 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100513 });
514
515 checkIOOBE(() -> {
516 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
517 });
518
519 checkIOOBE(() -> {
520 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
521 });
522
523 checkIOOBE(() -> {
524 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
525 });
526
527 checkIOOBE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700528 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
529 });
530
531 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100532 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
533 });
534
535 checkIOOBE(() -> {
536 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
537 });
538
539 checkIOOBE(() -> {
540 long o = (long) vh.getAndSet(array, ci, VALUE_1);
541 });
542
543 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700544 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
545 });
546
547 checkIOOBE(() -> {
548 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
549 });
550
551 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100552 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
553 });
554
555 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700556 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
557 });
558
559 checkIOOBE(() -> {
560 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
561 });
562
563 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700564 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
565 });
566
567 checkIOOBE(() -> {
568 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
569 });
570
571 checkIOOBE(() -> {
572 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
573 });
574
575 checkIOOBE(() -> {
576 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
577 });
578
579 checkIOOBE(() -> {
580 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
581 });
582
583 checkIOOBE(() -> {
584 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
585 });
586
587 checkIOOBE(() -> {
588 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
589 });
590
591 checkIOOBE(() -> {
592 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
593 });
594
595 checkIOOBE(() -> {
596 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
597 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100598 }
599 }
600 }
601
602 static void testArrayMisalignedAccess(ByteArraySource bs, VarHandleSource vhs) throws Throwable {
603 VarHandle vh = vhs.s;
604 byte[] array = bs.s;
605
606 int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE);
607
608 int length = array.length - SIZE + 1;
609 for (int i = 0; i < length; i++) {
610 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
611 final int ci = i;
612
613 if (!iAligned) {
614 checkISE(() -> {
615 long x = (long) vh.getVolatile(array, ci);
616 });
617
618 checkISE(() -> {
619 long x = (long) vh.getAcquire(array, ci);
620 });
621
622 checkISE(() -> {
623 long x = (long) vh.getOpaque(array, ci);
624 });
625
626 checkISE(() -> {
627 vh.setVolatile(array, ci, VALUE_1);
628 });
629
630 checkISE(() -> {
631 vh.setRelease(array, ci, VALUE_1);
632 });
633
634 checkISE(() -> {
635 vh.setOpaque(array, ci, VALUE_1);
636 });
637
638 checkISE(() -> {
639 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
640 });
641
642 checkISE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200643 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100644 });
645
646 checkISE(() -> {
647 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
648 });
649
650 checkISE(() -> {
651 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
652 });
653
654 checkISE(() -> {
655 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
656 });
657
658 checkISE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700659 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
660 });
661
662 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100663 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
664 });
665
666 checkISE(() -> {
667 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
668 });
669
670 checkISE(() -> {
671 long o = (long) vh.getAndSet(array, ci, VALUE_1);
672 });
673
674 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700675 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
676 });
677
678 checkISE(() -> {
679 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
680 });
681
682 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100683 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
684 });
685
686 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700687 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
688 });
689
690 checkISE(() -> {
691 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
692 });
693
694 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700695 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
696 });
697
698 checkISE(() -> {
699 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
700 });
701
702 checkISE(() -> {
703 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
704 });
705
706 checkISE(() -> {
707 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
708 });
709
710 checkISE(() -> {
711 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
712 });
713
714 checkISE(() -> {
715 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
716 });
717
718 checkISE(() -> {
719 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
720 });
721
722 checkISE(() -> {
723 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
724 });
725
726 checkISE(() -> {
727 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
728 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100729 }
730 }
731 }
732
733 static void testArrayMisalignedAccess(ByteBufferSource bs, VarHandleSource vhs) throws Throwable {
734 VarHandle vh = vhs.s;
735 ByteBuffer array = bs.s;
736
737 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
738 int misalignmentAtZero = array.alignmentOffset(0, SIZE);
739
740 int length = array.limit() - SIZE + 1;
741 for (int i = 0; i < length; i++) {
742 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
743 final int ci = i;
744
745 if (!iAligned) {
746 checkISE(() -> {
747 long x = (long) vh.getVolatile(array, ci);
748 });
749
750 checkISE(() -> {
751 long x = (long) vh.getAcquire(array, ci);
752 });
753
754 checkISE(() -> {
755 long x = (long) vh.getOpaque(array, ci);
756 });
757
758 if (!readOnly) {
759 checkISE(() -> {
760 vh.setVolatile(array, ci, VALUE_1);
761 });
762
763 checkISE(() -> {
764 vh.setRelease(array, ci, VALUE_1);
765 });
766
767 checkISE(() -> {
768 vh.setOpaque(array, ci, VALUE_1);
769 });
770
771 checkISE(() -> {
772 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
773 });
774
775 checkISE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200776 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100777 });
778
779 checkISE(() -> {
780 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
781 });
782
783 checkISE(() -> {
784 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
785 });
786
787 checkISE(() -> {
788 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
789 });
790
791 checkISE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700792 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
793 });
794
795 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100796 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
797 });
798
799 checkISE(() -> {
800 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
801 });
802
803 checkISE(() -> {
804 long o = (long) vh.getAndSet(array, ci, VALUE_1);
805 });
806
807 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700808 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
809 });
810
811 checkISE(() -> {
812 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
813 });
814
815 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100816 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
817 });
818
819 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700820 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
821 });
822
823 checkISE(() -> {
824 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
825 });
826
827 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700828 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
829 });
830
831 checkISE(() -> {
832 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
833 });
834
835 checkISE(() -> {
836 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
837 });
838
839 checkISE(() -> {
840 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
841 });
842
843 checkISE(() -> {
844 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
845 });
846
847 checkISE(() -> {
848 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
849 });
850
851 checkISE(() -> {
852 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
853 });
854
855 checkISE(() -> {
856 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
857 });
858
859 checkISE(() -> {
860 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
861 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100862 }
863 }
864 }
865 }
866
867 static void testArrayReadWrite(ByteArraySource bs, VarHandleSource vhs) {
868 VarHandle vh = vhs.s;
869 byte[] array = bs.s;
870
871 int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE);
872
873 bs.fill((byte) 0xff);
874 int length = array.length - SIZE + 1;
875 for (int i = 0; i < length; i++) {
876 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
877
878 // Plain
879 {
880 vh.set(array, i, VALUE_1);
881 long x = (long) vh.get(array, i);
882 assertEquals(x, VALUE_1, "get long value");
883 }
884
885
886 if (iAligned) {
887 // Volatile
888 {
889 vh.setVolatile(array, i, VALUE_2);
890 long x = (long) vh.getVolatile(array, i);
891 assertEquals(x, VALUE_2, "setVolatile long value");
892 }
893
894 // Lazy
895 {
896 vh.setRelease(array, i, VALUE_1);
897 long x = (long) vh.getAcquire(array, i);
898 assertEquals(x, VALUE_1, "setRelease long value");
899 }
900
901 // Opaque
902 {
903 vh.setOpaque(array, i, VALUE_2);
904 long x = (long) vh.getOpaque(array, i);
905 assertEquals(x, VALUE_2, "setOpaque long value");
906 }
907
908 vh.set(array, i, VALUE_1);
909
910 // Compare
911 {
912 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2);
913 assertEquals(r, true, "success compareAndSet long");
914 long x = (long) vh.get(array, i);
915 assertEquals(x, VALUE_2, "success compareAndSet long value");
916 }
917
918 {
919 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3);
920 assertEquals(r, false, "failing compareAndSet long");
921 long x = (long) vh.get(array, i);
922 assertEquals(x, VALUE_2, "failing compareAndSet long value");
923 }
924
925 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200926 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_1);
927 assertEquals(r, VALUE_2, "success compareAndExchange long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100928 long x = (long) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200929 assertEquals(x, VALUE_1, "success compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100930 }
931
932 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200933 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_3);
934 assertEquals(r, VALUE_1, "failing compareAndExchange long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100935 long x = (long) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200936 assertEquals(x, VALUE_1, "failing compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100937 }
938
939 {
940 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2);
941 assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long");
942 long x = (long) vh.get(array, i);
943 assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value");
944 }
945
946 {
947 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3);
948 assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long");
949 long x = (long) vh.get(array, i);
950 assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value");
951 }
952
953 {
954 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1);
955 assertEquals(r, VALUE_2, "success compareAndExchangeRelease long");
956 long x = (long) vh.get(array, i);
957 assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value");
958 }
959
960 {
961 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3);
962 assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long");
963 long x = (long) vh.get(array, i);
964 assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value");
965 }
966
967 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300968 boolean success = false;
969 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
970 success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
971 }
972 assertEquals(success, true, "weakCompareAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100973 long x = (long) vh.get(array, i);
974 assertEquals(x, VALUE_2, "weakCompareAndSet long value");
975 }
976
977 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300978 boolean success = false;
979 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
980 success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
981 }
982 assertEquals(success, true, "weakCompareAndSetAcquire long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100983 long x = (long) vh.get(array, i);
984 assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
985 }
986
987 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300988 boolean success = false;
989 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
990 success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
991 }
992 assertEquals(success, true, "weakCompareAndSetRelease long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100993 long x = (long) vh.get(array, i);
994 assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
995 }
996
Paul Sandoze9556602016-04-29 13:46:19 -0700997 {
998 boolean r = vh.weakCompareAndSetVolatile(array, i, VALUE_2, VALUE_1);
999 assertEquals(r, true, "weakCompareAndSetVolatile long");
1000 long x = (long) vh.get(array, i);
1001 assertEquals(x, VALUE_1, "weakCompareAndSetVolatile long value");
1002 }
1003
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001004 // Compare set and get
1005 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001006 vh.set(array, i, VALUE_1);
1007
Paul Sandoze9556602016-04-29 13:46:19 -07001008 long o = (long) vh.getAndSet(array, i, VALUE_2);
1009 assertEquals(o, VALUE_1, "getAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001010 long x = (long) vh.get(array, i);
Paul Sandoze9556602016-04-29 13:46:19 -07001011 assertEquals(x, VALUE_2, "getAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001012 }
1013
Paul Sandoz82d48912016-09-01 10:16:57 -07001014 {
1015 vh.set(array, i, VALUE_1);
1016
1017 long o = (long) vh.getAndSetAcquire(array, i, VALUE_2);
1018 assertEquals(o, VALUE_1, "getAndSetAcquire long");
1019 long x = (long) vh.get(array, i);
1020 assertEquals(x, VALUE_2, "getAndSetAcquire long value");
1021 }
1022
1023 {
1024 vh.set(array, i, VALUE_1);
1025
1026 long o = (long) vh.getAndSetRelease(array, i, VALUE_2);
1027 assertEquals(o, VALUE_1, "getAndSetRelease long");
1028 long x = (long) vh.get(array, i);
1029 assertEquals(x, VALUE_2, "getAndSetRelease long value");
1030 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001031
1032 // get and add, add and get
1033 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001034 vh.set(array, i, VALUE_1);
1035
Paul Sandozc073edc2016-09-01 10:17:01 -07001036 long o = (long) vh.getAndAdd(array, i, VALUE_2);
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001037 assertEquals(o, VALUE_1, "getAndAdd long");
Paul Sandozc073edc2016-09-01 10:17:01 -07001038 long x = (long) vh.get(array, i);
1039 assertEquals(x, VALUE_1 + VALUE_2, "getAndAdd long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001040 }
Paul Sandoz82d48912016-09-01 10:16:57 -07001041
1042 {
1043 vh.set(array, i, VALUE_1);
1044
1045 long o = (long) vh.getAndAddAcquire(array, i, VALUE_2);
1046 assertEquals(o, VALUE_1, "getAndAddAcquire long");
1047 long x = (long) vh.get(array, i);
1048 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddAcquire long value");
1049 }
1050
1051 {
1052 vh.set(array, i, VALUE_1);
1053
1054 long o = (long) vh.getAndAddRelease(array, i, VALUE_2);
1055 assertEquals(o, VALUE_1, "getAndAddRelease long");
1056 long x = (long) vh.get(array, i);
1057 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddRelease long value");
1058 }
1059
1060 // get and bitwise or
1061 {
1062 vh.set(array, i, VALUE_1);
1063
1064 long o = (long) vh.getAndBitwiseOr(array, i, VALUE_2);
1065 assertEquals(o, VALUE_1, "getAndBitwiseOr long");
1066 long x = (long) vh.get(array, i);
1067 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOr long value");
1068 }
1069
1070 {
1071 vh.set(array, i, VALUE_1);
1072
1073 long o = (long) vh.getAndBitwiseOrAcquire(array, i, VALUE_2);
1074 assertEquals(o, VALUE_1, "getAndBitwiseOrAcquire long");
1075 long x = (long) vh.get(array, i);
1076 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrAcquire long value");
1077 }
1078
1079 {
1080 vh.set(array, i, VALUE_1);
1081
1082 long o = (long) vh.getAndBitwiseOrRelease(array, i, VALUE_2);
1083 assertEquals(o, VALUE_1, "getAndBitwiseOrRelease long");
1084 long x = (long) vh.get(array, i);
1085 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrRelease long value");
1086 }
1087
1088 // get and bitwise and
1089 {
1090 vh.set(array, i, VALUE_1);
1091
1092 long o = (long) vh.getAndBitwiseAnd(array, i, VALUE_2);
1093 assertEquals(o, VALUE_1, "getAndBitwiseAnd long");
1094 long x = (long) vh.get(array, i);
1095 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAnd long value");
1096 }
1097
1098 {
1099 vh.set(array, i, VALUE_1);
1100
1101 long o = (long) vh.getAndBitwiseAndAcquire(array, i, VALUE_2);
1102 assertEquals(o, VALUE_1, "getAndBitwiseAndAcquire long");
1103 long x = (long) vh.get(array, i);
1104 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndAcquire long value");
1105 }
1106
1107 {
1108 vh.set(array, i, VALUE_1);
1109
1110 long o = (long) vh.getAndBitwiseAndRelease(array, i, VALUE_2);
1111 assertEquals(o, VALUE_1, "getAndBitwiseAndRelease long");
1112 long x = (long) vh.get(array, i);
1113 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndRelease long value");
1114 }
1115
1116 // get and bitwise xor
1117 {
1118 vh.set(array, i, VALUE_1);
1119
1120 long o = (long) vh.getAndBitwiseXor(array, i, VALUE_2);
1121 assertEquals(o, VALUE_1, "getAndBitwiseXor long");
1122 long x = (long) vh.get(array, i);
1123 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXor long value");
1124 }
1125
1126 {
1127 vh.set(array, i, VALUE_1);
1128
1129 long o = (long) vh.getAndBitwiseXorAcquire(array, i, VALUE_2);
1130 assertEquals(o, VALUE_1, "getAndBitwiseXorAcquire long");
1131 long x = (long) vh.get(array, i);
1132 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorAcquire long value");
1133 }
1134
1135 {
1136 vh.set(array, i, VALUE_1);
1137
1138 long o = (long) vh.getAndBitwiseXorRelease(array, i, VALUE_2);
1139 assertEquals(o, VALUE_1, "getAndBitwiseXorRelease long");
1140 long x = (long) vh.get(array, i);
1141 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorRelease long value");
1142 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001143 }
1144 }
1145 }
1146
1147
1148 static void testArrayReadWrite(ByteBufferSource bs, VarHandleSource vhs) {
1149 VarHandle vh = vhs.s;
1150 ByteBuffer array = bs.s;
1151
1152 int misalignmentAtZero = array.alignmentOffset(0, SIZE);
1153
1154 bs.fill((byte) 0xff);
1155 int length = array.limit() - SIZE + 1;
1156 for (int i = 0; i < length; i++) {
1157 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
1158
1159 // Plain
1160 {
1161 vh.set(array, i, VALUE_1);
1162 long x = (long) vh.get(array, i);
1163 assertEquals(x, VALUE_1, "get long value");
1164 }
1165
1166 if (iAligned) {
1167 // Volatile
1168 {
1169 vh.setVolatile(array, i, VALUE_2);
1170 long x = (long) vh.getVolatile(array, i);
1171 assertEquals(x, VALUE_2, "setVolatile long value");
1172 }
1173
1174 // Lazy
1175 {
1176 vh.setRelease(array, i, VALUE_1);
1177 long x = (long) vh.getAcquire(array, i);
1178 assertEquals(x, VALUE_1, "setRelease long value");
1179 }
1180
1181 // Opaque
1182 {
1183 vh.setOpaque(array, i, VALUE_2);
1184 long x = (long) vh.getOpaque(array, i);
1185 assertEquals(x, VALUE_2, "setOpaque long value");
1186 }
1187
1188 vh.set(array, i, VALUE_1);
1189
1190 // Compare
1191 {
1192 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2);
1193 assertEquals(r, true, "success compareAndSet long");
1194 long x = (long) vh.get(array, i);
1195 assertEquals(x, VALUE_2, "success compareAndSet long value");
1196 }
1197
1198 {
1199 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3);
1200 assertEquals(r, false, "failing compareAndSet long");
1201 long x = (long) vh.get(array, i);
1202 assertEquals(x, VALUE_2, "failing compareAndSet long value");
1203 }
1204
1205 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001206 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_1);
1207 assertEquals(r, VALUE_2, "success compareAndExchange long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001208 long x = (long) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001209 assertEquals(x, VALUE_1, "success compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001210 }
1211
1212 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001213 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_3);
1214 assertEquals(r, VALUE_1, "failing compareAndExchange long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001215 long x = (long) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001216 assertEquals(x, VALUE_1, "failing compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001217 }
1218
1219 {
1220 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2);
1221 assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long");
1222 long x = (long) vh.get(array, i);
1223 assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value");
1224 }
1225
1226 {
1227 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3);
1228 assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long");
1229 long x = (long) vh.get(array, i);
1230 assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value");
1231 }
1232
1233 {
1234 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1);
1235 assertEquals(r, VALUE_2, "success compareAndExchangeRelease long");
1236 long x = (long) vh.get(array, i);
1237 assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value");
1238 }
1239
1240 {
1241 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3);
1242 assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long");
1243 long x = (long) vh.get(array, i);
1244 assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value");
1245 }
1246
1247 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +03001248 boolean success = false;
1249 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1250 success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
1251 }
1252 assertEquals(success, true, "weakCompareAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001253 long x = (long) vh.get(array, i);
1254 assertEquals(x, VALUE_2, "weakCompareAndSet long value");
1255 }
1256
1257 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +03001258 boolean success = false;
1259 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1260 success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
1261 }
1262 assertEquals(success, true, "weakCompareAndSetAcquire long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001263 long x = (long) vh.get(array, i);
1264 assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
1265 }
1266
1267 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +03001268 boolean success = false;
1269 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1270 success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
1271 }
1272 assertEquals(success, true, "weakCompareAndSetRelease long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001273 long x = (long) vh.get(array, i);
1274 assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
1275 }
1276
Paul Sandoze9556602016-04-29 13:46:19 -07001277 {
1278 boolean r = vh.weakCompareAndSetVolatile(array, i, VALUE_2, VALUE_1);
1279 assertEquals(r, true, "weakCompareAndSetVolatile long");
1280 long x = (long) vh.get(array, i);
1281 assertEquals(x, VALUE_1, "weakCompareAndSetVolatile long value");
1282 }
1283
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001284 // Compare set and get
1285 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001286 vh.set(array, i, VALUE_1);
1287
Paul Sandoze9556602016-04-29 13:46:19 -07001288 long o = (long) vh.getAndSet(array, i, VALUE_2);
1289 assertEquals(o, VALUE_1, "getAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001290 long x = (long) vh.get(array, i);
Paul Sandoze9556602016-04-29 13:46:19 -07001291 assertEquals(x, VALUE_2, "getAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001292 }
1293
Paul Sandoz82d48912016-09-01 10:16:57 -07001294 {
1295 vh.set(array, i, VALUE_1);
1296
1297 long o = (long) vh.getAndSetAcquire(array, i, VALUE_2);
1298 assertEquals(o, VALUE_1, "getAndSetAcquire long");
1299 long x = (long) vh.get(array, i);
1300 assertEquals(x, VALUE_2, "getAndSetAcquire long value");
1301 }
1302
1303 {
1304 vh.set(array, i, VALUE_1);
1305
1306 long o = (long) vh.getAndSetRelease(array, i, VALUE_2);
1307 assertEquals(o, VALUE_1, "getAndSetRelease long");
1308 long x = (long) vh.get(array, i);
1309 assertEquals(x, VALUE_2, "getAndSetRelease long value");
1310 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001311
1312 // get and add, add and get
1313 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001314 vh.set(array, i, VALUE_1);
1315
Paul Sandozc073edc2016-09-01 10:17:01 -07001316 long o = (long) vh.getAndAdd(array, i, VALUE_2);
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001317 assertEquals(o, VALUE_1, "getAndAdd long");
Paul Sandozc073edc2016-09-01 10:17:01 -07001318 long x = (long) vh.get(array, i);
1319 assertEquals(x, VALUE_1 + VALUE_2, "getAndAdd long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001320 }
Paul Sandoz82d48912016-09-01 10:16:57 -07001321
1322 {
1323 vh.set(array, i, VALUE_1);
1324
1325 long o = (long) vh.getAndAddAcquire(array, i, VALUE_2);
1326 assertEquals(o, VALUE_1, "getAndAddAcquire long");
1327 long x = (long) vh.get(array, i);
1328 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddAcquire long value");
1329 }
1330
1331 {
1332 vh.set(array, i, VALUE_1);
1333
1334 long o = (long) vh.getAndAddRelease(array, i, VALUE_2);
1335 assertEquals(o, VALUE_1, "getAndAddRelease long");
1336 long x = (long) vh.get(array, i);
1337 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddRelease long value");
1338 }
1339
1340 // get and bitwise or
1341 {
1342 vh.set(array, i, VALUE_1);
1343
1344 long o = (long) vh.getAndBitwiseOr(array, i, VALUE_2);
1345 assertEquals(o, VALUE_1, "getAndBitwiseOr long");
1346 long x = (long) vh.get(array, i);
1347 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOr long value");
1348 }
1349
1350 {
1351 vh.set(array, i, VALUE_1);
1352
1353 long o = (long) vh.getAndBitwiseOrAcquire(array, i, VALUE_2);
1354 assertEquals(o, VALUE_1, "getAndBitwiseOrAcquire long");
1355 long x = (long) vh.get(array, i);
1356 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrAcquire long value");
1357 }
1358
1359 {
1360 vh.set(array, i, VALUE_1);
1361
1362 long o = (long) vh.getAndBitwiseOrRelease(array, i, VALUE_2);
1363 assertEquals(o, VALUE_1, "getAndBitwiseOrRelease long");
1364 long x = (long) vh.get(array, i);
1365 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrRelease long value");
1366 }
1367
1368 // get and bitwise and
1369 {
1370 vh.set(array, i, VALUE_1);
1371
1372 long o = (long) vh.getAndBitwiseAnd(array, i, VALUE_2);
1373 assertEquals(o, VALUE_1, "getAndBitwiseAnd long");
1374 long x = (long) vh.get(array, i);
1375 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAnd long value");
1376 }
1377
1378 {
1379 vh.set(array, i, VALUE_1);
1380
1381 long o = (long) vh.getAndBitwiseAndAcquire(array, i, VALUE_2);
1382 assertEquals(o, VALUE_1, "getAndBitwiseAndAcquire long");
1383 long x = (long) vh.get(array, i);
1384 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndAcquire long value");
1385 }
1386
1387 {
1388 vh.set(array, i, VALUE_1);
1389
1390 long o = (long) vh.getAndBitwiseAndRelease(array, i, VALUE_2);
1391 assertEquals(o, VALUE_1, "getAndBitwiseAndRelease long");
1392 long x = (long) vh.get(array, i);
1393 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndRelease long value");
1394 }
1395
1396 // get and bitwise xor
1397 {
1398 vh.set(array, i, VALUE_1);
1399
1400 long o = (long) vh.getAndBitwiseXor(array, i, VALUE_2);
1401 assertEquals(o, VALUE_1, "getAndBitwiseXor long");
1402 long x = (long) vh.get(array, i);
1403 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXor long value");
1404 }
1405
1406 {
1407 vh.set(array, i, VALUE_1);
1408
1409 long o = (long) vh.getAndBitwiseXorAcquire(array, i, VALUE_2);
1410 assertEquals(o, VALUE_1, "getAndBitwiseXorAcquire long");
1411 long x = (long) vh.get(array, i);
1412 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorAcquire long value");
1413 }
1414
1415 {
1416 vh.set(array, i, VALUE_1);
1417
1418 long o = (long) vh.getAndBitwiseXorRelease(array, i, VALUE_2);
1419 assertEquals(o, VALUE_1, "getAndBitwiseXorRelease long");
1420 long x = (long) vh.get(array, i);
1421 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorRelease long value");
1422 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001423 }
1424 }
1425 }
1426
1427 static void testArrayReadOnly(ByteBufferSource bs, VarHandleSource vhs) {
1428 VarHandle vh = vhs.s;
1429 ByteBuffer array = bs.s;
1430
1431 int misalignmentAtZero = array.alignmentOffset(0, SIZE);
1432
1433 ByteBuffer bb = ByteBuffer.allocate(SIZE);
1434 bb.order(MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes) ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN);
1435 bs.fill(bb.putLong(0, VALUE_2).array());
1436
1437 int length = array.limit() - SIZE + 1;
1438 for (int i = 0; i < length; i++) {
1439 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
1440
1441 long v = MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes)
1442 ? rotateLeft(VALUE_2, (i % SIZE) << 3)
1443 : rotateRight(VALUE_2, (i % SIZE) << 3);
1444 // Plain
1445 {
1446 long x = (long) vh.get(array, i);
1447 assertEquals(x, v, "get long value");
1448 }
1449
1450 if (iAligned) {
1451 // Volatile
1452 {
1453 long x = (long) vh.getVolatile(array, i);
1454 assertEquals(x, v, "getVolatile long value");
1455 }
1456
1457 // Lazy
1458 {
1459 long x = (long) vh.getAcquire(array, i);
1460 assertEquals(x, v, "getRelease long value");
1461 }
1462
1463 // Opaque
1464 {
1465 long x = (long) vh.getOpaque(array, i);
1466 assertEquals(x, v, "getOpaque long value");
1467 }
1468 }
1469 }
1470 }
1471
1472}
1473