blob: a0cabc8653a46aa8f510090c327c8cf08cb359f0 [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
53 static final long VALUE_3 = 0x2122232425262728L;
54
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));
92 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_VOLATILE));
93 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 Sandoz9fb30a32016-03-24 11:21:21 +0100100
Paul Sandoza7aff442016-04-13 15:05:48 +0200101 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
102 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.ADD_AND_GET));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100103 }
104
105 @Test(dataProvider = "typesProvider")
106 public void testTypes(VarHandle vh, List<java.lang.Class<?>> pts) {
107 assertEquals(vh.varType(), long.class);
108
109 assertEquals(vh.coordinateTypes(), pts);
110
111 testTypes(vh);
112 }
113
114
115 @DataProvider
116 public Object[][] accessTestCaseProvider() throws Exception {
117 List<AccessTestCase<?>> cases = new ArrayList<>();
118
119 for (ByteArrayViewSource<?> bav : bavss) {
120 for (VarHandleSource vh : vhss) {
121 if (vh.matches(bav)) {
122 if (bav instanceof ByteArraySource) {
123 ByteArraySource bas = (ByteArraySource) bav;
124
125 cases.add(new VarHandleSourceAccessTestCase(
126 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
127 true));
128 cases.add(new VarHandleSourceAccessTestCase(
129 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
130 false));
131 cases.add(new VarHandleSourceAccessTestCase(
132 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bas, h),
133 false));
134 cases.add(new VarHandleSourceAccessTestCase(
135 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bas, h),
136 false));
137 }
138 else {
139 ByteBufferSource bbs = (ByteBufferSource) bav;
140
141 if (MemoryMode.READ_WRITE.isSet(bav.memoryModes)) {
142 cases.add(new VarHandleSourceAccessTestCase(
143 "read write", bav, vh, h -> testArrayReadWrite(bbs, h),
144 true));
145 }
146 else {
147 cases.add(new VarHandleSourceAccessTestCase(
148 "read only", bav, vh, h -> testArrayReadOnly(bbs, h),
149 true));
150 }
151
152 cases.add(new VarHandleSourceAccessTestCase(
153 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
154 false));
155 cases.add(new VarHandleSourceAccessTestCase(
156 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bbs, h),
157 false));
158 cases.add(new VarHandleSourceAccessTestCase(
159 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bbs, h),
160 false));
161 }
162 }
163 }
164 }
165
166 // Work around issue with jtreg summary reporting which truncates
167 // the String result of Object.toString to 30 characters, hence
168 // the first dummy argument
169 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
170 }
171
172 @Test(dataProvider = "accessTestCaseProvider")
173 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
174 T t = atc.get();
175 int iters = atc.requiresLoop() ? ITERS : 1;
176 for (int c = 0; c < iters; c++) {
177 atc.testAccess(t);
178 }
179 }
180
181
182 static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
183 VarHandle vh = vhs.s;
184 byte[] array = bs.s;
185 int ci = 1;
186
187
188 }
189
190 static void testArrayUnsupported(ByteBufferSource bs, VarHandleSource vhs) {
191 VarHandle vh = vhs.s;
192 ByteBuffer array = bs.s;
193 int ci = 0;
194 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
195
196 if (readOnly) {
197 checkROBE(() -> {
198 vh.set(array, ci, VALUE_1);
199 });
200 }
201
202 if (readOnly) {
203 checkROBE(() -> {
204 vh.setVolatile(array, ci, VALUE_1);
205 });
206
207 checkROBE(() -> {
208 vh.setRelease(array, ci, VALUE_1);
209 });
210
211 checkROBE(() -> {
212 vh.setOpaque(array, ci, VALUE_1);
213 });
214
215 checkROBE(() -> {
216 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
217 });
218
219 checkROBE(() -> {
220 long r = (long) vh.compareAndExchangeVolatile(array, ci, VALUE_2, VALUE_1);
221 });
222
223 checkROBE(() -> {
224 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
225 });
226
227 checkROBE(() -> {
228 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
229 });
230
231 checkROBE(() -> {
232 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
233 });
234
235 checkROBE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700236 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
237 });
238
239 checkROBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100240 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
241 });
242
243 checkROBE(() -> {
244 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
245 });
246
247 checkROBE(() -> {
248 long o = (long) vh.getAndSet(array, ci, VALUE_1);
249 });
250 checkUOE(() -> {
251 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
252 });
253
254 checkROBE(() -> {
255 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
256 });
257
258 checkROBE(() -> {
259 long o = (long) vh.addAndGet(array, ci, VALUE_1);
260 });
261 }
262 else {
263 }
264 }
265
266
267 static void testArrayIndexOutOfBounds(ByteArraySource bs, VarHandleSource vhs) throws Throwable {
268 VarHandle vh = vhs.s;
269 byte[] array = bs.s;
270
271 int length = array.length - SIZE + 1;
272 for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) {
273 final int ci = i;
274
275 checkIOOBE(() -> {
276 long x = (long) vh.get(array, ci);
277 });
278
279 checkIOOBE(() -> {
280 vh.set(array, ci, VALUE_1);
281 });
282
283 checkIOOBE(() -> {
284 long x = (long) vh.getVolatile(array, ci);
285 });
286
287 checkIOOBE(() -> {
288 long x = (long) vh.getAcquire(array, ci);
289 });
290
291 checkIOOBE(() -> {
292 long x = (long) vh.getOpaque(array, ci);
293 });
294
295 checkIOOBE(() -> {
296 vh.setVolatile(array, ci, VALUE_1);
297 });
298
299 checkIOOBE(() -> {
300 vh.setRelease(array, ci, VALUE_1);
301 });
302
303 checkIOOBE(() -> {
304 vh.setOpaque(array, ci, VALUE_1);
305 });
306
307 checkIOOBE(() -> {
308 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
309 });
310
311 checkIOOBE(() -> {
312 long r = (long) vh.compareAndExchangeVolatile(array, ci, VALUE_2, VALUE_1);
313 });
314
315 checkIOOBE(() -> {
316 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
317 });
318
319 checkIOOBE(() -> {
320 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
321 });
322
323 checkIOOBE(() -> {
324 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
325 });
326
327 checkIOOBE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700328 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
329 });
330
331 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100332 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
333 });
334
335 checkIOOBE(() -> {
336 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
337 });
338
339 checkIOOBE(() -> {
340 long o = (long) vh.getAndSet(array, ci, VALUE_1);
341 });
342
343 checkIOOBE(() -> {
344 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
345 });
346
347 checkIOOBE(() -> {
348 long o = (long) vh.addAndGet(array, ci, VALUE_1);
349 });
350
351 }
352 }
353
354 static void testArrayIndexOutOfBounds(ByteBufferSource bs, VarHandleSource vhs) throws Throwable {
355 VarHandle vh = vhs.s;
356 ByteBuffer array = bs.s;
357
358 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
359
360 int length = array.limit() - SIZE + 1;
361 for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) {
362 final int ci = i;
363
364 checkIOOBE(() -> {
365 long x = (long) vh.get(array, ci);
366 });
367
368 if (!readOnly) {
369 checkIOOBE(() -> {
370 vh.set(array, ci, VALUE_1);
371 });
372 }
373
374 checkIOOBE(() -> {
375 long x = (long) vh.getVolatile(array, ci);
376 });
377
378 checkIOOBE(() -> {
379 long x = (long) vh.getAcquire(array, ci);
380 });
381
382 checkIOOBE(() -> {
383 long x = (long) vh.getOpaque(array, ci);
384 });
385
386 if (!readOnly) {
387 checkIOOBE(() -> {
388 vh.setVolatile(array, ci, VALUE_1);
389 });
390
391 checkIOOBE(() -> {
392 vh.setRelease(array, ci, VALUE_1);
393 });
394
395 checkIOOBE(() -> {
396 vh.setOpaque(array, ci, VALUE_1);
397 });
398
399 checkIOOBE(() -> {
400 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
401 });
402
403 checkIOOBE(() -> {
404 long r = (long) vh.compareAndExchangeVolatile(array, ci, VALUE_2, VALUE_1);
405 });
406
407 checkIOOBE(() -> {
408 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
409 });
410
411 checkIOOBE(() -> {
412 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
413 });
414
415 checkIOOBE(() -> {
416 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
417 });
418
419 checkIOOBE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700420 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
421 });
422
423 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100424 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
425 });
426
427 checkIOOBE(() -> {
428 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
429 });
430
431 checkIOOBE(() -> {
432 long o = (long) vh.getAndSet(array, ci, VALUE_1);
433 });
434
435 checkIOOBE(() -> {
436 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
437 });
438
439 checkIOOBE(() -> {
440 long o = (long) vh.addAndGet(array, ci, VALUE_1);
441 });
442 }
443 }
444 }
445
446 static void testArrayMisalignedAccess(ByteArraySource bs, VarHandleSource vhs) throws Throwable {
447 VarHandle vh = vhs.s;
448 byte[] array = bs.s;
449
450 int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE);
451
452 int length = array.length - SIZE + 1;
453 for (int i = 0; i < length; i++) {
454 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
455 final int ci = i;
456
457 if (!iAligned) {
458 checkISE(() -> {
459 long x = (long) vh.getVolatile(array, ci);
460 });
461
462 checkISE(() -> {
463 long x = (long) vh.getAcquire(array, ci);
464 });
465
466 checkISE(() -> {
467 long x = (long) vh.getOpaque(array, ci);
468 });
469
470 checkISE(() -> {
471 vh.setVolatile(array, ci, VALUE_1);
472 });
473
474 checkISE(() -> {
475 vh.setRelease(array, ci, VALUE_1);
476 });
477
478 checkISE(() -> {
479 vh.setOpaque(array, ci, VALUE_1);
480 });
481
482 checkISE(() -> {
483 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
484 });
485
486 checkISE(() -> {
487 long r = (long) vh.compareAndExchangeVolatile(array, ci, VALUE_2, VALUE_1);
488 });
489
490 checkISE(() -> {
491 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
492 });
493
494 checkISE(() -> {
495 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
496 });
497
498 checkISE(() -> {
499 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
500 });
501
502 checkISE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700503 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
504 });
505
506 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100507 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
508 });
509
510 checkISE(() -> {
511 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
512 });
513
514 checkISE(() -> {
515 long o = (long) vh.getAndSet(array, ci, VALUE_1);
516 });
517
518 checkISE(() -> {
519 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
520 });
521
522 checkISE(() -> {
523 long o = (long) vh.addAndGet(array, ci, VALUE_1);
524 });
525
526 }
527 }
528 }
529
530 static void testArrayMisalignedAccess(ByteBufferSource bs, VarHandleSource vhs) throws Throwable {
531 VarHandle vh = vhs.s;
532 ByteBuffer array = bs.s;
533
534 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
535 int misalignmentAtZero = array.alignmentOffset(0, SIZE);
536
537 int length = array.limit() - SIZE + 1;
538 for (int i = 0; i < length; i++) {
539 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
540 final int ci = i;
541
542 if (!iAligned) {
543 checkISE(() -> {
544 long x = (long) vh.getVolatile(array, ci);
545 });
546
547 checkISE(() -> {
548 long x = (long) vh.getAcquire(array, ci);
549 });
550
551 checkISE(() -> {
552 long x = (long) vh.getOpaque(array, ci);
553 });
554
555 if (!readOnly) {
556 checkISE(() -> {
557 vh.setVolatile(array, ci, VALUE_1);
558 });
559
560 checkISE(() -> {
561 vh.setRelease(array, ci, VALUE_1);
562 });
563
564 checkISE(() -> {
565 vh.setOpaque(array, ci, VALUE_1);
566 });
567
568 checkISE(() -> {
569 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
570 });
571
572 checkISE(() -> {
573 long r = (long) vh.compareAndExchangeVolatile(array, ci, VALUE_2, VALUE_1);
574 });
575
576 checkISE(() -> {
577 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
578 });
579
580 checkISE(() -> {
581 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
582 });
583
584 checkISE(() -> {
585 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
586 });
587
588 checkISE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700589 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
590 });
591
592 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100593 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
594 });
595
596 checkISE(() -> {
597 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
598 });
599
600 checkISE(() -> {
601 long o = (long) vh.getAndSet(array, ci, VALUE_1);
602 });
603
604 checkISE(() -> {
605 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
606 });
607
608 checkISE(() -> {
609 long o = (long) vh.addAndGet(array, ci, VALUE_1);
610 });
611 }
612 }
613 }
614 }
615
616 static void testArrayReadWrite(ByteArraySource bs, VarHandleSource vhs) {
617 VarHandle vh = vhs.s;
618 byte[] array = bs.s;
619
620 int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE);
621
622 bs.fill((byte) 0xff);
623 int length = array.length - SIZE + 1;
624 for (int i = 0; i < length; i++) {
625 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
626
627 // Plain
628 {
629 vh.set(array, i, VALUE_1);
630 long x = (long) vh.get(array, i);
631 assertEquals(x, VALUE_1, "get long value");
632 }
633
634
635 if (iAligned) {
636 // Volatile
637 {
638 vh.setVolatile(array, i, VALUE_2);
639 long x = (long) vh.getVolatile(array, i);
640 assertEquals(x, VALUE_2, "setVolatile long value");
641 }
642
643 // Lazy
644 {
645 vh.setRelease(array, i, VALUE_1);
646 long x = (long) vh.getAcquire(array, i);
647 assertEquals(x, VALUE_1, "setRelease long value");
648 }
649
650 // Opaque
651 {
652 vh.setOpaque(array, i, VALUE_2);
653 long x = (long) vh.getOpaque(array, i);
654 assertEquals(x, VALUE_2, "setOpaque long value");
655 }
656
657 vh.set(array, i, VALUE_1);
658
659 // Compare
660 {
661 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2);
662 assertEquals(r, true, "success compareAndSet long");
663 long x = (long) vh.get(array, i);
664 assertEquals(x, VALUE_2, "success compareAndSet long value");
665 }
666
667 {
668 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3);
669 assertEquals(r, false, "failing compareAndSet long");
670 long x = (long) vh.get(array, i);
671 assertEquals(x, VALUE_2, "failing compareAndSet long value");
672 }
673
674 {
675 long r = (long) vh.compareAndExchangeVolatile(array, i, VALUE_2, VALUE_1);
676 assertEquals(r, VALUE_2, "success compareAndExchangeVolatile long");
677 long x = (long) vh.get(array, i);
678 assertEquals(x, VALUE_1, "success compareAndExchangeVolatile long value");
679 }
680
681 {
682 long r = (long) vh.compareAndExchangeVolatile(array, i, VALUE_2, VALUE_3);
683 assertEquals(r, VALUE_1, "failing compareAndExchangeVolatile long");
684 long x = (long) vh.get(array, i);
685 assertEquals(x, VALUE_1, "failing compareAndExchangeVolatile long value");
686 }
687
688 {
689 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2);
690 assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long");
691 long x = (long) vh.get(array, i);
692 assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value");
693 }
694
695 {
696 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3);
697 assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long");
698 long x = (long) vh.get(array, i);
699 assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value");
700 }
701
702 {
703 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1);
704 assertEquals(r, VALUE_2, "success compareAndExchangeRelease long");
705 long x = (long) vh.get(array, i);
706 assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value");
707 }
708
709 {
710 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3);
711 assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long");
712 long x = (long) vh.get(array, i);
713 assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value");
714 }
715
716 {
717 boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
718 assertEquals(r, true, "weakCompareAndSet long");
719 long x = (long) vh.get(array, i);
720 assertEquals(x, VALUE_2, "weakCompareAndSet long value");
721 }
722
723 {
724 boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
725 assertEquals(r, true, "weakCompareAndSetAcquire long");
726 long x = (long) vh.get(array, i);
727 assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
728 }
729
730 {
731 boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
732 assertEquals(r, true, "weakCompareAndSetRelease long");
733 long x = (long) vh.get(array, i);
734 assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
735 }
736
Paul Sandoze9556602016-04-29 13:46:19 -0700737 {
738 boolean r = vh.weakCompareAndSetVolatile(array, i, VALUE_2, VALUE_1);
739 assertEquals(r, true, "weakCompareAndSetVolatile long");
740 long x = (long) vh.get(array, i);
741 assertEquals(x, VALUE_1, "weakCompareAndSetVolatile long value");
742 }
743
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100744 // Compare set and get
745 {
Paul Sandoze9556602016-04-29 13:46:19 -0700746 long o = (long) vh.getAndSet(array, i, VALUE_2);
747 assertEquals(o, VALUE_1, "getAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100748 long x = (long) vh.get(array, i);
Paul Sandoze9556602016-04-29 13:46:19 -0700749 assertEquals(x, VALUE_2, "getAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100750 }
751
752 vh.set(array, i, VALUE_1);
753
754 // get and add, add and get
755 {
756 long o = (long) vh.getAndAdd(array, i, VALUE_3);
757 assertEquals(o, VALUE_1, "getAndAdd long");
758 long c = (long) vh.addAndGet(array, i, VALUE_3);
759 assertEquals(c, VALUE_1 + VALUE_3 + VALUE_3, "getAndAdd long value");
760 }
761 }
762 }
763 }
764
765
766 static void testArrayReadWrite(ByteBufferSource bs, VarHandleSource vhs) {
767 VarHandle vh = vhs.s;
768 ByteBuffer array = bs.s;
769
770 int misalignmentAtZero = array.alignmentOffset(0, SIZE);
771
772 bs.fill((byte) 0xff);
773 int length = array.limit() - SIZE + 1;
774 for (int i = 0; i < length; i++) {
775 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
776
777 // Plain
778 {
779 vh.set(array, i, VALUE_1);
780 long x = (long) vh.get(array, i);
781 assertEquals(x, VALUE_1, "get long value");
782 }
783
784 if (iAligned) {
785 // Volatile
786 {
787 vh.setVolatile(array, i, VALUE_2);
788 long x = (long) vh.getVolatile(array, i);
789 assertEquals(x, VALUE_2, "setVolatile long value");
790 }
791
792 // Lazy
793 {
794 vh.setRelease(array, i, VALUE_1);
795 long x = (long) vh.getAcquire(array, i);
796 assertEquals(x, VALUE_1, "setRelease long value");
797 }
798
799 // Opaque
800 {
801 vh.setOpaque(array, i, VALUE_2);
802 long x = (long) vh.getOpaque(array, i);
803 assertEquals(x, VALUE_2, "setOpaque long value");
804 }
805
806 vh.set(array, i, VALUE_1);
807
808 // Compare
809 {
810 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2);
811 assertEquals(r, true, "success compareAndSet long");
812 long x = (long) vh.get(array, i);
813 assertEquals(x, VALUE_2, "success compareAndSet long value");
814 }
815
816 {
817 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3);
818 assertEquals(r, false, "failing compareAndSet long");
819 long x = (long) vh.get(array, i);
820 assertEquals(x, VALUE_2, "failing compareAndSet long value");
821 }
822
823 {
824 long r = (long) vh.compareAndExchangeVolatile(array, i, VALUE_2, VALUE_1);
825 assertEquals(r, VALUE_2, "success compareAndExchangeVolatile long");
826 long x = (long) vh.get(array, i);
827 assertEquals(x, VALUE_1, "success compareAndExchangeVolatile long value");
828 }
829
830 {
831 long r = (long) vh.compareAndExchangeVolatile(array, i, VALUE_2, VALUE_3);
832 assertEquals(r, VALUE_1, "failing compareAndExchangeVolatile long");
833 long x = (long) vh.get(array, i);
834 assertEquals(x, VALUE_1, "failing compareAndExchangeVolatile long value");
835 }
836
837 {
838 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2);
839 assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long");
840 long x = (long) vh.get(array, i);
841 assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value");
842 }
843
844 {
845 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3);
846 assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long");
847 long x = (long) vh.get(array, i);
848 assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value");
849 }
850
851 {
852 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1);
853 assertEquals(r, VALUE_2, "success compareAndExchangeRelease long");
854 long x = (long) vh.get(array, i);
855 assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value");
856 }
857
858 {
859 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3);
860 assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long");
861 long x = (long) vh.get(array, i);
862 assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value");
863 }
864
865 {
866 boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
867 assertEquals(r, true, "weakCompareAndSet long");
868 long x = (long) vh.get(array, i);
869 assertEquals(x, VALUE_2, "weakCompareAndSet long value");
870 }
871
872 {
873 boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
874 assertEquals(r, true, "weakCompareAndSetAcquire long");
875 long x = (long) vh.get(array, i);
876 assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
877 }
878
879 {
880 boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
881 assertEquals(r, true, "weakCompareAndSetRelease long");
882 long x = (long) vh.get(array, i);
883 assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
884 }
885
Paul Sandoze9556602016-04-29 13:46:19 -0700886 {
887 boolean r = vh.weakCompareAndSetVolatile(array, i, VALUE_2, VALUE_1);
888 assertEquals(r, true, "weakCompareAndSetVolatile long");
889 long x = (long) vh.get(array, i);
890 assertEquals(x, VALUE_1, "weakCompareAndSetVolatile long value");
891 }
892
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100893 // Compare set and get
894 {
Paul Sandoze9556602016-04-29 13:46:19 -0700895 long o = (long) vh.getAndSet(array, i, VALUE_2);
896 assertEquals(o, VALUE_1, "getAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100897 long x = (long) vh.get(array, i);
Paul Sandoze9556602016-04-29 13:46:19 -0700898 assertEquals(x, VALUE_2, "getAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100899 }
900
901 vh.set(array, i, VALUE_1);
902
903 // get and add, add and get
904 {
905 long o = (long) vh.getAndAdd(array, i, VALUE_3);
906 assertEquals(o, VALUE_1, "getAndAdd long");
907 long c = (long) vh.addAndGet(array, i, VALUE_3);
908 assertEquals(c, VALUE_1 + VALUE_3 + VALUE_3, "getAndAdd long value");
909 }
910 }
911 }
912 }
913
914 static void testArrayReadOnly(ByteBufferSource bs, VarHandleSource vhs) {
915 VarHandle vh = vhs.s;
916 ByteBuffer array = bs.s;
917
918 int misalignmentAtZero = array.alignmentOffset(0, SIZE);
919
920 ByteBuffer bb = ByteBuffer.allocate(SIZE);
921 bb.order(MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes) ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN);
922 bs.fill(bb.putLong(0, VALUE_2).array());
923
924 int length = array.limit() - SIZE + 1;
925 for (int i = 0; i < length; i++) {
926 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
927
928 long v = MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes)
929 ? rotateLeft(VALUE_2, (i % SIZE) << 3)
930 : rotateRight(VALUE_2, (i % SIZE) << 3);
931 // Plain
932 {
933 long x = (long) vh.get(array, i);
934 assertEquals(x, v, "get long value");
935 }
936
937 if (iAligned) {
938 // Volatile
939 {
940 long x = (long) vh.getVolatile(array, i);
941 assertEquals(x, v, "getVolatile long value");
942 }
943
944 // Lazy
945 {
946 long x = (long) vh.getAcquire(array, i);
947 assertEquals(x, v, "getRelease long value");
948 }
949
950 // Opaque
951 {
952 long x = (long) vh.getOpaque(array, i);
953 assertEquals(x, v, "getOpaque long value");
954 }
955 }
956 }
957 }
958
959}
960