1 /*
2  * Copyright (c) 2015, 2020, 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  * @bug 8154556
27  * @run testng/othervm/timeout=360 -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsLong
28  * @run testng/othervm/timeout=360 -Diters=20000                         VarHandleTestByteArrayAsLong
29  * @run testng/othervm/timeout=360 -Diters=20000 -XX:-TieredCompilation  VarHandleTestByteArrayAsLong
30  */
31 
32 import org.testng.annotations.DataProvider;
33 import org.testng.annotations.Test;
34 
35 import java.lang.invoke.MethodHandles;
36 import java.lang.invoke.VarHandle;
37 import java.nio.ByteBuffer;
38 import java.nio.ByteOrder;
39 import java.util.ArrayList;
40 import java.util.Arrays;
41 import java.util.EnumSet;
42 import java.util.List;
43 
44 import static org.testng.Assert.*;
45 
46 public 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 = 0xFFFEFDFCFBFAF9F8L;
54 
55 
56     @Override
setupVarHandleSources(boolean same)57     public List<VarHandleSource> setupVarHandleSources(boolean same) {
58         // Combinations of VarHandle byte[] or ByteBuffer
59         List<VarHandleSource> vhss = new ArrayList<>();
60         for (MemoryMode endianess : List.of(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) {
61 
62             ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN
63                     ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
64 
65             Class<?> arrayType;
66             if (same) {
67                 arrayType = long[].class;
68             }
69             else {
70                 arrayType = int[].class;
71             }
72             VarHandleSource aeh = new VarHandleSource(
73                     MethodHandles.byteArrayViewVarHandle(arrayType, bo),
74                     endianess, MemoryMode.READ_WRITE);
75             vhss.add(aeh);
76 
77             VarHandleSource bbh = new VarHandleSource(
78                     MethodHandles.byteBufferViewVarHandle(arrayType, bo),
79                     endianess, MemoryMode.READ_WRITE);
80             vhss.add(bbh);
81         }
82         return vhss;
83     }
84 
85     @Test
testEquals()86     public void testEquals() {
87         VarHandle[] vhs1 = setupVarHandleSources(true).stream().
88             map(vhs -> vhs.s).toArray(VarHandle[]::new);
89         VarHandle[] vhs2 = setupVarHandleSources(true).stream().
90             map(vhs -> vhs.s).toArray(VarHandle[]::new);
91 
92         for (int i = 0; i < vhs1.length; i++) {
93             for (int j = 0; j < vhs1.length; j++) {
94                 if (i != j) {
95                     assertNotEquals(vhs1[i], vhs1[j]);
96                     assertNotEquals(vhs1[i], vhs2[j]);
97                 }
98             }
99         }
100 
101         VarHandle[] vhs3 = setupVarHandleSources(false).stream().
102             map(vhs -> vhs.s).toArray(VarHandle[]::new);
103         for (int i = 0; i < vhs1.length; i++) {
104             assertNotEquals(vhs1[i], vhs3[i]);
105         }
106     }
107 
108     @Test(dataProvider = "varHandlesProvider")
testIsAccessModeSupported(VarHandleSource vhs)109     public void testIsAccessModeSupported(VarHandleSource vhs) {
110         VarHandle vh = vhs.s;
111 
112         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET));
113         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
114 
115         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE));
116         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE));
117         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE));
118         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE));
119         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE));
120         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE));
121 
122         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET));
123         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE));
124         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
125         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
126         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN));
127         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
128         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
129         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
130         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
131         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE));
132         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE));
133 
134         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
135         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE));
136         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE));
137 
138         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR));
139         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE));
140         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE));
141         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND));
142         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE));
143         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE));
144         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR));
145         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE));
146         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE));
147     }
148 
149     @Test(dataProvider = "typesProvider")
testTypes(VarHandle vh, List<java.lang.Class<?>> pts)150     public void testTypes(VarHandle vh, List<java.lang.Class<?>> pts) {
151         assertEquals(vh.varType(), long.class);
152 
153         assertEquals(vh.coordinateTypes(), pts);
154 
155         testTypes(vh);
156     }
157 
158 
159     @DataProvider
accessTestCaseProvider()160     public Object[][] accessTestCaseProvider() throws Exception {
161         List<AccessTestCase<?>> cases = new ArrayList<>();
162 
163         for (ByteArrayViewSource<?> bav : bavss) {
164             for (VarHandleSource vh : vhss) {
165                 if (vh.matches(bav)) {
166                     if (bav instanceof ByteArraySource) {
167                         ByteArraySource bas = (ByteArraySource) bav;
168 
169                         cases.add(new VarHandleSourceAccessTestCase(
170                                 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
171                                 true));
172                         cases.add(new VarHandleSourceAccessTestCase(
173                                 "null array", bav, vh, h -> testArrayNPE(bas, h),
174                                 false));
175                         cases.add(new VarHandleSourceAccessTestCase(
176                                 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
177                                 false));
178                         cases.add(new VarHandleSourceAccessTestCase(
179                                 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bas, h),
180                                 false));
181                         cases.add(new VarHandleSourceAccessTestCase(
182                                 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bas, h),
183                                 false));
184                     }
185                     else {
186                         ByteBufferSource bbs = (ByteBufferSource) bav;
187 
188                         if (MemoryMode.READ_WRITE.isSet(bav.memoryModes)) {
189                             cases.add(new VarHandleSourceAccessTestCase(
190                                     "read write", bav, vh, h -> testArrayReadWrite(bbs, h),
191                                     true));
192                         }
193                         else {
194                             cases.add(new VarHandleSourceAccessTestCase(
195                                     "read only", bav, vh, h -> testArrayReadOnly(bbs, h),
196                                     true));
197                         }
198 
199                         cases.add(new VarHandleSourceAccessTestCase(
200                                 "null buffer", bav, vh, h -> testArrayNPE(bbs, h),
201                                 false));
202                         cases.add(new VarHandleSourceAccessTestCase(
203                                 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
204                                 false));
205                         cases.add(new VarHandleSourceAccessTestCase(
206                                 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bbs, h),
207                                 false));
208                         cases.add(new VarHandleSourceAccessTestCase(
209                                 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bbs, h),
210                                 false));
211                     }
212                 }
213             }
214         }
215 
216         // Work around issue with jtreg summary reporting which truncates
217         // the String result of Object.toString to 30 characters, hence
218         // the first dummy argument
219         return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
220     }
221 
222     @Test(dataProvider = "accessTestCaseProvider")
testAccess(String desc, AccessTestCase<T> atc)223     public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
224         T t = atc.get();
225         int iters = atc.requiresLoop() ? ITERS : 1;
226         for (int c = 0; c < iters; c++) {
227             atc.testAccess(t);
228         }
229     }
230 
231 
testArrayNPE(ByteArraySource bs, VarHandleSource vhs)232     static void testArrayNPE(ByteArraySource bs, VarHandleSource vhs) {
233         VarHandle vh = vhs.s;
234         byte[] array = null;
235         int ci = 1;
236 
237         checkNPE(() -> {
238             long x = (long) vh.get(array, ci);
239         });
240 
241         checkNPE(() -> {
242             vh.set(array, ci, VALUE_1);
243         });
244 
245         checkNPE(() -> {
246             long x = (long) vh.getVolatile(array, ci);
247         });
248 
249         checkNPE(() -> {
250             long x = (long) vh.getAcquire(array, ci);
251         });
252 
253         checkNPE(() -> {
254             long x = (long) vh.getOpaque(array, ci);
255         });
256 
257         checkNPE(() -> {
258             vh.setVolatile(array, ci, VALUE_1);
259         });
260 
261         checkNPE(() -> {
262             vh.setRelease(array, ci, VALUE_1);
263         });
264 
265         checkNPE(() -> {
266             vh.setOpaque(array, ci, VALUE_1);
267         });
268 
269         checkNPE(() -> {
270             boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
271         });
272 
273         checkNPE(() -> {
274             long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
275         });
276 
277         checkNPE(() -> {
278             long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
279         });
280 
281         checkNPE(() -> {
282             long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
283         });
284 
285         checkNPE(() -> {
286             boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
287         });
288 
289         checkNPE(() -> {
290             boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
291         });
292 
293         checkNPE(() -> {
294             boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
295         });
296 
297         checkNPE(() -> {
298             boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
299         });
300 
301         checkNPE(() -> {
302             long o = (long) vh.getAndSet(array, ci, VALUE_1);
303         });
304 
305         checkNPE(() -> {
306             long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
307         });
308 
309         checkNPE(() -> {
310             long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
311         });
312 
313         checkNPE(() -> {
314             long o = (long) vh.getAndAdd(array, ci, VALUE_1);
315         });
316 
317         checkNPE(() -> {
318             long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
319         });
320 
321         checkNPE(() -> {
322             long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
323         });
324 
325         checkNPE(() -> {
326             long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
327         });
328 
329         checkNPE(() -> {
330             long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
331         });
332 
333         checkNPE(() -> {
334             long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
335         });
336 
337         checkNPE(() -> {
338             long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
339         });
340 
341         checkNPE(() -> {
342             long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
343         });
344 
345         checkNPE(() -> {
346             long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
347         });
348 
349         checkNPE(() -> {
350             long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
351         });
352 
353         checkNPE(() -> {
354             long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
355         });
356 
357         checkNPE(() -> {
358             long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
359         });
360     }
361 
testArrayNPE(ByteBufferSource bs, VarHandleSource vhs)362     static void testArrayNPE(ByteBufferSource bs, VarHandleSource vhs) {
363         VarHandle vh = vhs.s;
364         ByteBuffer array = null;
365         int ci = 1;
366 
367         checkNPE(() -> {
368             long x = (long) vh.get(array, ci);
369         });
370 
371         checkNPE(() -> {
372             vh.set(array, ci, VALUE_1);
373         });
374 
375         checkNPE(() -> {
376             long x = (long) vh.getVolatile(array, ci);
377         });
378 
379         checkNPE(() -> {
380             long x = (long) vh.getAcquire(array, ci);
381         });
382 
383         checkNPE(() -> {
384             long x = (long) vh.getOpaque(array, ci);
385         });
386 
387         checkNPE(() -> {
388             vh.setVolatile(array, ci, VALUE_1);
389         });
390 
391         checkNPE(() -> {
392             vh.setRelease(array, ci, VALUE_1);
393         });
394 
395         checkNPE(() -> {
396             vh.setOpaque(array, ci, VALUE_1);
397         });
398 
399         checkNPE(() -> {
400             boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
401         });
402 
403         checkNPE(() -> {
404             long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
405         });
406 
407         checkNPE(() -> {
408             long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
409         });
410 
411         checkNPE(() -> {
412             long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
413         });
414 
415         checkNPE(() -> {
416             boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
417         });
418 
419         checkNPE(() -> {
420             boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
421         });
422 
423         checkNPE(() -> {
424             boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
425         });
426 
427         checkNPE(() -> {
428             boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
429         });
430 
431         checkNPE(() -> {
432             long o = (long) vh.getAndSet(array, ci, VALUE_1);
433         });
434 
435         checkNPE(() -> {
436             long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
437         });
438 
439         checkNPE(() -> {
440             long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
441         });
442 
443         checkNPE(() -> {
444             long o = (long) vh.getAndAdd(array, ci, VALUE_1);
445         });
446 
447         checkNPE(() -> {
448             long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
449         });
450 
451         checkNPE(() -> {
452             long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
453         });
454 
455         checkNPE(() -> {
456             long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
457         });
458 
459         checkNPE(() -> {
460             long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
461         });
462 
463         checkNPE(() -> {
464             long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
465         });
466 
467         checkNPE(() -> {
468             long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
469         });
470 
471         checkNPE(() -> {
472             long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
473         });
474 
475         checkNPE(() -> {
476             long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
477         });
478 
479         checkNPE(() -> {
480             long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
481         });
482 
483         checkNPE(() -> {
484             long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
485         });
486 
487         checkNPE(() -> {
488             long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
489         });
490     }
491 
testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs)492     static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
493         VarHandle vh = vhs.s;
494         byte[] array = bs.s;
495         int ci = 1;
496 
497 
498 
499     }
500 
testArrayUnsupported(ByteBufferSource bs, VarHandleSource vhs)501     static void testArrayUnsupported(ByteBufferSource bs, VarHandleSource vhs) {
502         VarHandle vh = vhs.s;
503         ByteBuffer array = bs.s;
504         int ci = 0;
505         boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
506 
507         if (readOnly) {
508             checkROBE(() -> {
509                 vh.set(array, ci, VALUE_1);
510             });
511         }
512 
513         if (readOnly) {
514             checkROBE(() -> {
515                 vh.setVolatile(array, ci, VALUE_1);
516             });
517 
518             checkROBE(() -> {
519                 vh.setRelease(array, ci, VALUE_1);
520             });
521 
522             checkROBE(() -> {
523                 vh.setOpaque(array, ci, VALUE_1);
524             });
525 
526             checkROBE(() -> {
527                 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
528             });
529 
530             checkROBE(() -> {
531                 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
532             });
533 
534             checkROBE(() -> {
535                 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
536             });
537 
538             checkROBE(() -> {
539                 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
540             });
541 
542             checkROBE(() -> {
543                 boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
544             });
545 
546             checkROBE(() -> {
547                 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
548             });
549 
550             checkROBE(() -> {
551                 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
552             });
553 
554             checkROBE(() -> {
555                 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
556             });
557 
558             checkROBE(() -> {
559                 long o = (long) vh.getAndSet(array, ci, VALUE_1);
560             });
561 
562             checkROBE(() -> {
563                 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
564             });
565 
566             checkROBE(() -> {
567                 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
568             });
569 
570 
571             checkROBE(() -> {
572                 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
573             });
574 
575             checkROBE(() -> {
576                 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
577             });
578 
579             checkROBE(() -> {
580                 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
581             });
582 
583             checkROBE(() -> {
584                 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
585             });
586 
587             checkROBE(() -> {
588                 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
589             });
590 
591             checkROBE(() -> {
592                 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
593             });
594 
595             checkROBE(() -> {
596                 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
597             });
598 
599             checkROBE(() -> {
600                 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
601             });
602 
603             checkROBE(() -> {
604                 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
605             });
606 
607             checkROBE(() -> {
608                 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
609             });
610 
611             checkROBE(() -> {
612                 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
613             });
614 
615             checkROBE(() -> {
616                 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
617             });
618         }
619         else {
620         }
621     }
622 
623 
testArrayIndexOutOfBounds(ByteArraySource bs, VarHandleSource vhs)624     static void testArrayIndexOutOfBounds(ByteArraySource bs, VarHandleSource vhs) throws Throwable {
625         VarHandle vh = vhs.s;
626         byte[] array = bs.s;
627 
628         int length = array.length - SIZE + 1;
629         for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) {
630             final int ci = i;
631 
632             checkIOOBE(() -> {
633                 long x = (long) vh.get(array, ci);
634             });
635 
636             checkIOOBE(() -> {
637                 vh.set(array, ci, VALUE_1);
638             });
639 
640             checkIOOBE(() -> {
641                 long x = (long) vh.getVolatile(array, ci);
642             });
643 
644             checkIOOBE(() -> {
645                 long x = (long) vh.getAcquire(array, ci);
646             });
647 
648             checkIOOBE(() -> {
649                 long x = (long) vh.getOpaque(array, ci);
650             });
651 
652             checkIOOBE(() -> {
653                 vh.setVolatile(array, ci, VALUE_1);
654             });
655 
656             checkIOOBE(() -> {
657                 vh.setRelease(array, ci, VALUE_1);
658             });
659 
660             checkIOOBE(() -> {
661                 vh.setOpaque(array, ci, VALUE_1);
662             });
663 
664             checkIOOBE(() -> {
665                 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
666             });
667 
668             checkIOOBE(() -> {
669                 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
670             });
671 
672             checkIOOBE(() -> {
673                 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
674             });
675 
676             checkIOOBE(() -> {
677                 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
678             });
679 
680             checkIOOBE(() -> {
681                 boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
682             });
683 
684             checkIOOBE(() -> {
685                 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
686             });
687 
688             checkIOOBE(() -> {
689                 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
690             });
691 
692             checkIOOBE(() -> {
693                 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
694             });
695 
696             checkIOOBE(() -> {
697                 long o = (long) vh.getAndSet(array, ci, VALUE_1);
698             });
699 
700             checkIOOBE(() -> {
701                 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
702             });
703 
704             checkIOOBE(() -> {
705                 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
706             });
707 
708             checkIOOBE(() -> {
709                 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
710             });
711 
712             checkIOOBE(() -> {
713                 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
714             });
715 
716             checkIOOBE(() -> {
717                 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
718             });
719 
720             checkIOOBE(() -> {
721                 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
722             });
723 
724             checkIOOBE(() -> {
725                 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
726             });
727 
728             checkIOOBE(() -> {
729                 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
730             });
731 
732             checkIOOBE(() -> {
733                 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
734             });
735 
736             checkIOOBE(() -> {
737                 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
738             });
739 
740             checkIOOBE(() -> {
741                 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
742             });
743 
744             checkIOOBE(() -> {
745                 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
746             });
747 
748             checkIOOBE(() -> {
749                 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
750             });
751 
752             checkIOOBE(() -> {
753                 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
754             });
755 
756         }
757     }
758 
testArrayIndexOutOfBounds(ByteBufferSource bs, VarHandleSource vhs)759     static void testArrayIndexOutOfBounds(ByteBufferSource bs, VarHandleSource vhs) throws Throwable {
760         VarHandle vh = vhs.s;
761         ByteBuffer array = bs.s;
762 
763         boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
764 
765         int length = array.limit() - SIZE + 1;
766         for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) {
767             final int ci = i;
768 
769             checkIOOBE(() -> {
770                 long x = (long) vh.get(array, ci);
771             });
772 
773             if (!readOnly) {
774                 checkIOOBE(() -> {
775                     vh.set(array, ci, VALUE_1);
776                 });
777             }
778 
779             checkIOOBE(() -> {
780                 long x = (long) vh.getVolatile(array, ci);
781             });
782 
783             checkIOOBE(() -> {
784                 long x = (long) vh.getAcquire(array, ci);
785             });
786 
787             checkIOOBE(() -> {
788                 long x = (long) vh.getOpaque(array, ci);
789             });
790 
791             if (!readOnly) {
792                 checkIOOBE(() -> {
793                     vh.setVolatile(array, ci, VALUE_1);
794                 });
795 
796                 checkIOOBE(() -> {
797                     vh.setRelease(array, ci, VALUE_1);
798                 });
799 
800                 checkIOOBE(() -> {
801                     vh.setOpaque(array, ci, VALUE_1);
802                 });
803 
804                 checkIOOBE(() -> {
805                     boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
806                 });
807 
808                 checkIOOBE(() -> {
809                     long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
810                 });
811 
812                 checkIOOBE(() -> {
813                     long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
814                 });
815 
816                 checkIOOBE(() -> {
817                     long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
818                 });
819 
820                 checkIOOBE(() -> {
821                     boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
822                 });
823 
824                 checkIOOBE(() -> {
825                     boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
826                 });
827 
828                 checkIOOBE(() -> {
829                     boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
830                 });
831 
832                 checkIOOBE(() -> {
833                     boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
834                 });
835 
836                 checkIOOBE(() -> {
837                     long o = (long) vh.getAndSet(array, ci, VALUE_1);
838                 });
839 
840                 checkIOOBE(() -> {
841                     long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
842                 });
843 
844                 checkIOOBE(() -> {
845                     long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
846                 });
847 
848                 checkIOOBE(() -> {
849                     long o = (long) vh.getAndAdd(array, ci, VALUE_1);
850                 });
851 
852                 checkIOOBE(() -> {
853                     long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
854                 });
855 
856                 checkIOOBE(() -> {
857                     long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
858                 });
859 
860                 checkIOOBE(() -> {
861                     long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
862                 });
863 
864                 checkIOOBE(() -> {
865                     long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
866                 });
867 
868                 checkIOOBE(() -> {
869                     long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
870                 });
871 
872                 checkIOOBE(() -> {
873                     long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
874                 });
875 
876                 checkIOOBE(() -> {
877                     long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
878                 });
879 
880                 checkIOOBE(() -> {
881                     long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
882                 });
883 
884                 checkIOOBE(() -> {
885                     long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
886                 });
887 
888                 checkIOOBE(() -> {
889                     long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
890                 });
891 
892                 checkIOOBE(() -> {
893                     long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
894                 });
895             }
896         }
897     }
898 
testArrayMisalignedAccess(ByteArraySource bs, VarHandleSource vhs)899     static void testArrayMisalignedAccess(ByteArraySource bs, VarHandleSource vhs) throws Throwable {
900         VarHandle vh = vhs.s;
901         byte[] array = bs.s;
902 
903         int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE);
904 
905         int length = array.length - SIZE + 1;
906         for (int i = 0; i < length; i++) {
907             boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
908             final int ci = i;
909 
910             if (!iAligned) {
911                 checkISE(() -> {
912                     long x = (long) vh.getVolatile(array, ci);
913                 });
914 
915                 checkISE(() -> {
916                     long x = (long) vh.getAcquire(array, ci);
917                 });
918 
919                 checkISE(() -> {
920                     long x = (long) vh.getOpaque(array, ci);
921                 });
922 
923                 checkISE(() -> {
924                     vh.setVolatile(array, ci, VALUE_1);
925                 });
926 
927                 checkISE(() -> {
928                     vh.setRelease(array, ci, VALUE_1);
929                 });
930 
931                 checkISE(() -> {
932                     vh.setOpaque(array, ci, VALUE_1);
933                 });
934 
935                 checkISE(() -> {
936                     boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
937                 });
938 
939                 checkISE(() -> {
940                     long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
941                 });
942 
943                 checkISE(() -> {
944                     long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
945                 });
946 
947                 checkISE(() -> {
948                     long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
949                 });
950 
951                 checkISE(() -> {
952                     boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
953                 });
954 
955                 checkISE(() -> {
956                     boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
957                 });
958 
959                 checkISE(() -> {
960                     boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
961                 });
962 
963                 checkISE(() -> {
964                     boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
965                 });
966 
967                 checkISE(() -> {
968                     long o = (long) vh.getAndSet(array, ci, VALUE_1);
969                 });
970 
971                 checkISE(() -> {
972                     long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
973                 });
974 
975                 checkISE(() -> {
976                     long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
977                 });
978 
979                 checkISE(() -> {
980                     long o = (long) vh.getAndAdd(array, ci, VALUE_1);
981                 });
982 
983                 checkISE(() -> {
984                     long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
985                 });
986 
987                 checkISE(() -> {
988                     long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
989                 });
990 
991                 checkISE(() -> {
992                     long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
993                 });
994 
995                 checkISE(() -> {
996                     long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
997                 });
998 
999                 checkISE(() -> {
1000                     long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
1001                 });
1002 
1003                 checkISE(() -> {
1004                     long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
1005                 });
1006 
1007                 checkISE(() -> {
1008                     long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
1009                 });
1010 
1011                 checkISE(() -> {
1012                     long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
1013                 });
1014 
1015                 checkISE(() -> {
1016                     long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
1017                 });
1018 
1019                 checkISE(() -> {
1020                     long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
1021                 });
1022 
1023                 checkISE(() -> {
1024                     long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
1025                 });
1026             }
1027         }
1028     }
1029 
testArrayMisalignedAccess(ByteBufferSource bs, VarHandleSource vhs)1030     static void testArrayMisalignedAccess(ByteBufferSource bs, VarHandleSource vhs) throws Throwable {
1031         VarHandle vh = vhs.s;
1032         ByteBuffer array = bs.s;
1033 
1034         boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
1035         int misalignmentAtZero = array.alignmentOffset(0, SIZE);
1036 
1037         int length = array.limit() - SIZE + 1;
1038         for (int i = 0; i < length; i++) {
1039             boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
1040             final int ci = i;
1041 
1042             if (!iAligned) {
1043                 checkISE(() -> {
1044                     long x = (long) vh.getVolatile(array, ci);
1045                 });
1046 
1047                 checkISE(() -> {
1048                     long x = (long) vh.getAcquire(array, ci);
1049                 });
1050 
1051                 checkISE(() -> {
1052                     long x = (long) vh.getOpaque(array, ci);
1053                 });
1054 
1055                 if (!readOnly) {
1056                     checkISE(() -> {
1057                         vh.setVolatile(array, ci, VALUE_1);
1058                     });
1059 
1060                     checkISE(() -> {
1061                         vh.setRelease(array, ci, VALUE_1);
1062                     });
1063 
1064                     checkISE(() -> {
1065                         vh.setOpaque(array, ci, VALUE_1);
1066                     });
1067 
1068                     checkISE(() -> {
1069                         boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
1070                     });
1071 
1072                     checkISE(() -> {
1073                         long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
1074                     });
1075 
1076                     checkISE(() -> {
1077                         long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
1078                     });
1079 
1080                     checkISE(() -> {
1081                         long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
1082                     });
1083 
1084                     checkISE(() -> {
1085                         boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
1086                     });
1087 
1088                     checkISE(() -> {
1089                         boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
1090                     });
1091 
1092                     checkISE(() -> {
1093                         boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
1094                     });
1095 
1096                     checkISE(() -> {
1097                         boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
1098                     });
1099 
1100                     checkISE(() -> {
1101                         long o = (long) vh.getAndSet(array, ci, VALUE_1);
1102                     });
1103 
1104                     checkISE(() -> {
1105                         long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
1106                     });
1107 
1108                     checkISE(() -> {
1109                         long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
1110                     });
1111 
1112                     checkISE(() -> {
1113                         long o = (long) vh.getAndAdd(array, ci, VALUE_1);
1114                     });
1115 
1116                     checkISE(() -> {
1117                         long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
1118                     });
1119 
1120                     checkISE(() -> {
1121                         long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
1122                     });
1123 
1124                     checkISE(() -> {
1125                         long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
1126                     });
1127 
1128                     checkISE(() -> {
1129                         long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
1130                     });
1131 
1132                     checkISE(() -> {
1133                         long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
1134                     });
1135 
1136                     checkISE(() -> {
1137                         long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
1138                     });
1139 
1140                     checkISE(() -> {
1141                         long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
1142                     });
1143 
1144                     checkISE(() -> {
1145                         long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
1146                     });
1147 
1148                     checkISE(() -> {
1149                         long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
1150                     });
1151 
1152                     checkISE(() -> {
1153                         long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
1154                     });
1155 
1156                     checkISE(() -> {
1157                         long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
1158                     });
1159                 }
1160             }
1161         }
1162     }
1163 
testArrayReadWrite(ByteArraySource bs, VarHandleSource vhs)1164     static void testArrayReadWrite(ByteArraySource bs, VarHandleSource vhs) {
1165         VarHandle vh = vhs.s;
1166         byte[] array = bs.s;
1167 
1168         int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE);
1169 
1170         bs.fill((byte) 0xff);
1171         int length = array.length - SIZE + 1;
1172         for (int i = 0; i < length; i++) {
1173             boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
1174 
1175             // Plain
1176             {
1177                 vh.set(array, i, VALUE_1);
1178                 long x = (long) vh.get(array, i);
1179                 assertEquals(x, VALUE_1, "get long value");
1180             }
1181 
1182 
1183             if (iAligned) {
1184                 // Volatile
1185                 {
1186                     vh.setVolatile(array, i, VALUE_2);
1187                     long x = (long) vh.getVolatile(array, i);
1188                     assertEquals(x, VALUE_2, "setVolatile long value");
1189                 }
1190 
1191                 // Lazy
1192                 {
1193                     vh.setRelease(array, i, VALUE_1);
1194                     long x = (long) vh.getAcquire(array, i);
1195                     assertEquals(x, VALUE_1, "setRelease long value");
1196                 }
1197 
1198                 // Opaque
1199                 {
1200                     vh.setOpaque(array, i, VALUE_2);
1201                     long x = (long) vh.getOpaque(array, i);
1202                     assertEquals(x, VALUE_2, "setOpaque long value");
1203                 }
1204 
1205                 vh.set(array, i, VALUE_1);
1206 
1207                 // Compare
1208                 {
1209                     boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2);
1210                     assertEquals(r, true, "success compareAndSet long");
1211                     long x = (long) vh.get(array, i);
1212                     assertEquals(x, VALUE_2, "success compareAndSet long value");
1213                 }
1214 
1215                 {
1216                     boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3);
1217                     assertEquals(r, false, "failing compareAndSet long");
1218                     long x = (long) vh.get(array, i);
1219                     assertEquals(x, VALUE_2, "failing compareAndSet long value");
1220                 }
1221 
1222                 {
1223                     long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_1);
1224                     assertEquals(r, VALUE_2, "success compareAndExchange long");
1225                     long x = (long) vh.get(array, i);
1226                     assertEquals(x, VALUE_1, "success compareAndExchange long value");
1227                 }
1228 
1229                 {
1230                     long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_3);
1231                     assertEquals(r, VALUE_1, "failing compareAndExchange long");
1232                     long x = (long) vh.get(array, i);
1233                     assertEquals(x, VALUE_1, "failing compareAndExchange long value");
1234                 }
1235 
1236                 {
1237                     long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2);
1238                     assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long");
1239                     long x = (long) vh.get(array, i);
1240                     assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value");
1241                 }
1242 
1243                 {
1244                     long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3);
1245                     assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long");
1246                     long x = (long) vh.get(array, i);
1247                     assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value");
1248                 }
1249 
1250                 {
1251                     long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1);
1252                     assertEquals(r, VALUE_2, "success compareAndExchangeRelease long");
1253                     long x = (long) vh.get(array, i);
1254                     assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value");
1255                 }
1256 
1257                 {
1258                     long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3);
1259                     assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long");
1260                     long x = (long) vh.get(array, i);
1261                     assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value");
1262                 }
1263 
1264                 {
1265                     boolean success = false;
1266                     for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1267                         success = vh.weakCompareAndSetPlain(array, i, VALUE_1, VALUE_2);
1268                     }
1269                     assertEquals(success, true, "weakCompareAndSetPlain long");
1270                     long x = (long) vh.get(array, i);
1271                     assertEquals(x, VALUE_2, "weakCompareAndSetPlain long value");
1272                 }
1273 
1274                 {
1275                     boolean success = false;
1276                     for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1277                         success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
1278                     }
1279                     assertEquals(success, true, "weakCompareAndSetAcquire long");
1280                     long x = (long) vh.get(array, i);
1281                     assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
1282                 }
1283 
1284                 {
1285                     boolean success = false;
1286                     for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1287                         success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
1288                     }
1289                     assertEquals(success, true, "weakCompareAndSetRelease long");
1290                     long x = (long) vh.get(array, i);
1291                     assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
1292                 }
1293 
1294                 {
1295                     boolean success = false;
1296                     for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1297                         success = vh.weakCompareAndSet(array, i, VALUE_2, VALUE_1);
1298                     }
1299                     assertEquals(success, true, "weakCompareAndSet long");
1300                     long x = (long) vh.get(array, i);
1301                     assertEquals(x, VALUE_1, "weakCompareAndSet long");
1302                 }
1303 
1304                 // Compare set and get
1305                 {
1306                     vh.set(array, i, VALUE_1);
1307 
1308                     long o = (long) vh.getAndSet(array, i, VALUE_2);
1309                     assertEquals(o, VALUE_1, "getAndSet long");
1310                     long x = (long) vh.get(array, i);
1311                     assertEquals(x, VALUE_2, "getAndSet long value");
1312                 }
1313 
1314                 {
1315                     vh.set(array, i, VALUE_1);
1316 
1317                     long o = (long) vh.getAndSetAcquire(array, i, VALUE_2);
1318                     assertEquals(o, VALUE_1, "getAndSetAcquire long");
1319                     long x = (long) vh.get(array, i);
1320                     assertEquals(x, VALUE_2, "getAndSetAcquire long value");
1321                 }
1322 
1323                 {
1324                     vh.set(array, i, VALUE_1);
1325 
1326                     long o = (long) vh.getAndSetRelease(array, i, VALUE_2);
1327                     assertEquals(o, VALUE_1, "getAndSetRelease long");
1328                     long x = (long) vh.get(array, i);
1329                     assertEquals(x, VALUE_2, "getAndSetRelease long value");
1330                 }
1331 
1332                 // get and add, add and get
1333                 {
1334                     vh.set(array, i, VALUE_1);
1335 
1336                     long o = (long) vh.getAndAdd(array, i, VALUE_2);
1337                     assertEquals(o, VALUE_1, "getAndAdd long");
1338                     long x = (long) vh.get(array, i);
1339                     assertEquals(x, VALUE_1 + VALUE_2, "getAndAdd long value");
1340                 }
1341 
1342                 {
1343                     vh.set(array, i, VALUE_1);
1344 
1345                     long o = (long) vh.getAndAddAcquire(array, i, VALUE_2);
1346                     assertEquals(o, VALUE_1, "getAndAddAcquire long");
1347                     long x = (long) vh.get(array, i);
1348                     assertEquals(x, VALUE_1 + VALUE_2, "getAndAddAcquire long value");
1349                 }
1350 
1351                 {
1352                     vh.set(array, i, VALUE_1);
1353 
1354                     long o = (long) vh.getAndAddRelease(array, i, VALUE_2);
1355                     assertEquals(o, VALUE_1, "getAndAddRelease long");
1356                     long x = (long) vh.get(array, i);
1357                     assertEquals(x, VALUE_1 + VALUE_2, "getAndAddRelease long value");
1358                 }
1359 
1360                 // get and bitwise or
1361                 {
1362                     vh.set(array, i, VALUE_1);
1363 
1364                     long o = (long) vh.getAndBitwiseOr(array, i, VALUE_2);
1365                     assertEquals(o, VALUE_1, "getAndBitwiseOr long");
1366                     long x = (long) vh.get(array, i);
1367                     assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOr long value");
1368                 }
1369 
1370                 {
1371                     vh.set(array, i, VALUE_1);
1372 
1373                     long o = (long) vh.getAndBitwiseOrAcquire(array, i, VALUE_2);
1374                     assertEquals(o, VALUE_1, "getAndBitwiseOrAcquire long");
1375                     long x = (long) vh.get(array, i);
1376                     assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrAcquire long value");
1377                 }
1378 
1379                 {
1380                     vh.set(array, i, VALUE_1);
1381 
1382                     long o = (long) vh.getAndBitwiseOrRelease(array, i, VALUE_2);
1383                     assertEquals(o, VALUE_1, "getAndBitwiseOrRelease long");
1384                     long x = (long) vh.get(array, i);
1385                     assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrRelease long value");
1386                 }
1387 
1388                 // get and bitwise and
1389                 {
1390                     vh.set(array, i, VALUE_1);
1391 
1392                     long o = (long) vh.getAndBitwiseAnd(array, i, VALUE_2);
1393                     assertEquals(o, VALUE_1, "getAndBitwiseAnd long");
1394                     long x = (long) vh.get(array, i);
1395                     assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAnd long value");
1396                 }
1397 
1398                 {
1399                     vh.set(array, i, VALUE_1);
1400 
1401                     long o = (long) vh.getAndBitwiseAndAcquire(array, i, VALUE_2);
1402                     assertEquals(o, VALUE_1, "getAndBitwiseAndAcquire long");
1403                     long x = (long) vh.get(array, i);
1404                     assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndAcquire long value");
1405                 }
1406 
1407                 {
1408                     vh.set(array, i, VALUE_1);
1409 
1410                     long o = (long) vh.getAndBitwiseAndRelease(array, i, VALUE_2);
1411                     assertEquals(o, VALUE_1, "getAndBitwiseAndRelease long");
1412                     long x = (long) vh.get(array, i);
1413                     assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndRelease long value");
1414                 }
1415 
1416                 // get and bitwise xor
1417                 {
1418                     vh.set(array, i, VALUE_1);
1419 
1420                     long o = (long) vh.getAndBitwiseXor(array, i, VALUE_2);
1421                     assertEquals(o, VALUE_1, "getAndBitwiseXor long");
1422                     long x = (long) vh.get(array, i);
1423                     assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXor long value");
1424                 }
1425 
1426                 {
1427                     vh.set(array, i, VALUE_1);
1428 
1429                     long o = (long) vh.getAndBitwiseXorAcquire(array, i, VALUE_2);
1430                     assertEquals(o, VALUE_1, "getAndBitwiseXorAcquire long");
1431                     long x = (long) vh.get(array, i);
1432                     assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorAcquire long value");
1433                 }
1434 
1435                 {
1436                     vh.set(array, i, VALUE_1);
1437 
1438                     long o = (long) vh.getAndBitwiseXorRelease(array, i, VALUE_2);
1439                     assertEquals(o, VALUE_1, "getAndBitwiseXorRelease long");
1440                     long x = (long) vh.get(array, i);
1441                     assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorRelease long value");
1442                 }
1443             }
1444         }
1445     }
1446 
1447 
testArrayReadWrite(ByteBufferSource bs, VarHandleSource vhs)1448     static void testArrayReadWrite(ByteBufferSource bs, VarHandleSource vhs) {
1449         VarHandle vh = vhs.s;
1450         ByteBuffer array = bs.s;
1451 
1452         int misalignmentAtZero = array.alignmentOffset(0, SIZE);
1453 
1454         bs.fill((byte) 0xff);
1455         int length = array.limit() - SIZE + 1;
1456         for (int i = 0; i < length; i++) {
1457             boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
1458 
1459             // Plain
1460             {
1461                 vh.set(array, i, VALUE_1);
1462                 long x = (long) vh.get(array, i);
1463                 assertEquals(x, VALUE_1, "get long value");
1464             }
1465 
1466             if (iAligned) {
1467                 // Volatile
1468                 {
1469                     vh.setVolatile(array, i, VALUE_2);
1470                     long x = (long) vh.getVolatile(array, i);
1471                     assertEquals(x, VALUE_2, "setVolatile long value");
1472                 }
1473 
1474                 // Lazy
1475                 {
1476                     vh.setRelease(array, i, VALUE_1);
1477                     long x = (long) vh.getAcquire(array, i);
1478                     assertEquals(x, VALUE_1, "setRelease long value");
1479                 }
1480 
1481                 // Opaque
1482                 {
1483                     vh.setOpaque(array, i, VALUE_2);
1484                     long x = (long) vh.getOpaque(array, i);
1485                     assertEquals(x, VALUE_2, "setOpaque long value");
1486                 }
1487 
1488                 vh.set(array, i, VALUE_1);
1489 
1490                 // Compare
1491                 {
1492                     boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2);
1493                     assertEquals(r, true, "success compareAndSet long");
1494                     long x = (long) vh.get(array, i);
1495                     assertEquals(x, VALUE_2, "success compareAndSet long value");
1496                 }
1497 
1498                 {
1499                     boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3);
1500                     assertEquals(r, false, "failing compareAndSet long");
1501                     long x = (long) vh.get(array, i);
1502                     assertEquals(x, VALUE_2, "failing compareAndSet long value");
1503                 }
1504 
1505                 {
1506                     long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_1);
1507                     assertEquals(r, VALUE_2, "success compareAndExchange long");
1508                     long x = (long) vh.get(array, i);
1509                     assertEquals(x, VALUE_1, "success compareAndExchange long value");
1510                 }
1511 
1512                 {
1513                     long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_3);
1514                     assertEquals(r, VALUE_1, "failing compareAndExchange long");
1515                     long x = (long) vh.get(array, i);
1516                     assertEquals(x, VALUE_1, "failing compareAndExchange long value");
1517                 }
1518 
1519                 {
1520                     long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2);
1521                     assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long");
1522                     long x = (long) vh.get(array, i);
1523                     assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value");
1524                 }
1525 
1526                 {
1527                     long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3);
1528                     assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long");
1529                     long x = (long) vh.get(array, i);
1530                     assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value");
1531                 }
1532 
1533                 {
1534                     long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1);
1535                     assertEquals(r, VALUE_2, "success compareAndExchangeRelease long");
1536                     long x = (long) vh.get(array, i);
1537                     assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value");
1538                 }
1539 
1540                 {
1541                     long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3);
1542                     assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long");
1543                     long x = (long) vh.get(array, i);
1544                     assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value");
1545                 }
1546 
1547                 {
1548                     boolean success = false;
1549                     for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1550                         success = vh.weakCompareAndSetPlain(array, i, VALUE_1, VALUE_2);
1551                     }
1552                     assertEquals(success, true, "weakCompareAndSetPlain long");
1553                     long x = (long) vh.get(array, i);
1554                     assertEquals(x, VALUE_2, "weakCompareAndSetPlain long value");
1555                 }
1556 
1557                 {
1558                     boolean success = false;
1559                     for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1560                         success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
1561                     }
1562                     assertEquals(success, true, "weakCompareAndSetAcquire long");
1563                     long x = (long) vh.get(array, i);
1564                     assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
1565                 }
1566 
1567                 {
1568                     boolean success = false;
1569                     for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1570                         success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
1571                     }
1572                     assertEquals(success, true, "weakCompareAndSetRelease long");
1573                     long x = (long) vh.get(array, i);
1574                     assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
1575                 }
1576 
1577                 {
1578                     boolean success = false;
1579                     for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1580                         success = vh.weakCompareAndSet(array, i, VALUE_2, VALUE_1);
1581                     }
1582                     assertEquals(success, true, "weakCompareAndSet long");
1583                     long x = (long) vh.get(array, i);
1584                     assertEquals(x, VALUE_1, "weakCompareAndSet long");
1585                 }
1586 
1587                 // Compare set and get
1588                 {
1589                     vh.set(array, i, VALUE_1);
1590 
1591                     long o = (long) vh.getAndSet(array, i, VALUE_2);
1592                     assertEquals(o, VALUE_1, "getAndSet long");
1593                     long x = (long) vh.get(array, i);
1594                     assertEquals(x, VALUE_2, "getAndSet long value");
1595                 }
1596 
1597                 {
1598                     vh.set(array, i, VALUE_1);
1599 
1600                     long o = (long) vh.getAndSetAcquire(array, i, VALUE_2);
1601                     assertEquals(o, VALUE_1, "getAndSetAcquire long");
1602                     long x = (long) vh.get(array, i);
1603                     assertEquals(x, VALUE_2, "getAndSetAcquire long value");
1604                 }
1605 
1606                 {
1607                     vh.set(array, i, VALUE_1);
1608 
1609                     long o = (long) vh.getAndSetRelease(array, i, VALUE_2);
1610                     assertEquals(o, VALUE_1, "getAndSetRelease long");
1611                     long x = (long) vh.get(array, i);
1612                     assertEquals(x, VALUE_2, "getAndSetRelease long value");
1613                 }
1614 
1615                 // get and add, add and get
1616                 {
1617                     vh.set(array, i, VALUE_1);
1618 
1619                     long o = (long) vh.getAndAdd(array, i, VALUE_2);
1620                     assertEquals(o, VALUE_1, "getAndAdd long");
1621                     long x = (long) vh.get(array, i);
1622                     assertEquals(x, VALUE_1 + VALUE_2, "getAndAdd long value");
1623                 }
1624 
1625                 {
1626                     vh.set(array, i, VALUE_1);
1627 
1628                     long o = (long) vh.getAndAddAcquire(array, i, VALUE_2);
1629                     assertEquals(o, VALUE_1, "getAndAddAcquire long");
1630                     long x = (long) vh.get(array, i);
1631                     assertEquals(x, VALUE_1 + VALUE_2, "getAndAddAcquire long value");
1632                 }
1633 
1634                 {
1635                     vh.set(array, i, VALUE_1);
1636 
1637                     long o = (long) vh.getAndAddRelease(array, i, VALUE_2);
1638                     assertEquals(o, VALUE_1, "getAndAddRelease long");
1639                     long x = (long) vh.get(array, i);
1640                     assertEquals(x, VALUE_1 + VALUE_2, "getAndAddRelease long value");
1641                 }
1642 
1643                 // get and bitwise or
1644                 {
1645                     vh.set(array, i, VALUE_1);
1646 
1647                     long o = (long) vh.getAndBitwiseOr(array, i, VALUE_2);
1648                     assertEquals(o, VALUE_1, "getAndBitwiseOr long");
1649                     long x = (long) vh.get(array, i);
1650                     assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOr long value");
1651                 }
1652 
1653                 {
1654                     vh.set(array, i, VALUE_1);
1655 
1656                     long o = (long) vh.getAndBitwiseOrAcquire(array, i, VALUE_2);
1657                     assertEquals(o, VALUE_1, "getAndBitwiseOrAcquire long");
1658                     long x = (long) vh.get(array, i);
1659                     assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrAcquire long value");
1660                 }
1661 
1662                 {
1663                     vh.set(array, i, VALUE_1);
1664 
1665                     long o = (long) vh.getAndBitwiseOrRelease(array, i, VALUE_2);
1666                     assertEquals(o, VALUE_1, "getAndBitwiseOrRelease long");
1667                     long x = (long) vh.get(array, i);
1668                     assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrRelease long value");
1669                 }
1670 
1671                 // get and bitwise and
1672                 {
1673                     vh.set(array, i, VALUE_1);
1674 
1675                     long o = (long) vh.getAndBitwiseAnd(array, i, VALUE_2);
1676                     assertEquals(o, VALUE_1, "getAndBitwiseAnd long");
1677                     long x = (long) vh.get(array, i);
1678                     assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAnd long value");
1679                 }
1680 
1681                 {
1682                     vh.set(array, i, VALUE_1);
1683 
1684                     long o = (long) vh.getAndBitwiseAndAcquire(array, i, VALUE_2);
1685                     assertEquals(o, VALUE_1, "getAndBitwiseAndAcquire long");
1686                     long x = (long) vh.get(array, i);
1687                     assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndAcquire long value");
1688                 }
1689 
1690                 {
1691                     vh.set(array, i, VALUE_1);
1692 
1693                     long o = (long) vh.getAndBitwiseAndRelease(array, i, VALUE_2);
1694                     assertEquals(o, VALUE_1, "getAndBitwiseAndRelease long");
1695                     long x = (long) vh.get(array, i);
1696                     assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndRelease long value");
1697                 }
1698 
1699                 // get and bitwise xor
1700                 {
1701                     vh.set(array, i, VALUE_1);
1702 
1703                     long o = (long) vh.getAndBitwiseXor(array, i, VALUE_2);
1704                     assertEquals(o, VALUE_1, "getAndBitwiseXor long");
1705                     long x = (long) vh.get(array, i);
1706                     assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXor long value");
1707                 }
1708 
1709                 {
1710                     vh.set(array, i, VALUE_1);
1711 
1712                     long o = (long) vh.getAndBitwiseXorAcquire(array, i, VALUE_2);
1713                     assertEquals(o, VALUE_1, "getAndBitwiseXorAcquire long");
1714                     long x = (long) vh.get(array, i);
1715                     assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorAcquire long value");
1716                 }
1717 
1718                 {
1719                     vh.set(array, i, VALUE_1);
1720 
1721                     long o = (long) vh.getAndBitwiseXorRelease(array, i, VALUE_2);
1722                     assertEquals(o, VALUE_1, "getAndBitwiseXorRelease long");
1723                     long x = (long) vh.get(array, i);
1724                     assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorRelease long value");
1725                 }
1726             }
1727         }
1728     }
1729 
testArrayReadOnly(ByteBufferSource bs, VarHandleSource vhs)1730     static void testArrayReadOnly(ByteBufferSource bs, VarHandleSource vhs) {
1731         VarHandle vh = vhs.s;
1732         ByteBuffer array = bs.s;
1733 
1734         int misalignmentAtZero = array.alignmentOffset(0, SIZE);
1735 
1736         ByteBuffer bb = ByteBuffer.allocate(SIZE);
1737         bb.order(MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes) ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN);
1738         bs.fill(bb.putLong(0, VALUE_2).array());
1739 
1740         int length = array.limit() - SIZE + 1;
1741         for (int i = 0; i < length; i++) {
1742             boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
1743 
1744             long v = MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes)
1745                     ? rotateLeft(VALUE_2, (i % SIZE) << 3)
1746                     : rotateRight(VALUE_2, (i % SIZE) << 3);
1747             // Plain
1748             {
1749                 long x = (long) vh.get(array, i);
1750                 assertEquals(x, v, "get long value");
1751             }
1752 
1753             if (iAligned) {
1754                 // Volatile
1755                 {
1756                     long x = (long) vh.getVolatile(array, i);
1757                     assertEquals(x, v, "getVolatile long value");
1758                 }
1759 
1760                 // Lazy
1761                 {
1762                     long x = (long) vh.getAcquire(array, i);
1763                     assertEquals(x, v, "getRelease long value");
1764                 }
1765 
1766                 // Opaque
1767                 {
1768                     long x = (long) vh.getOpaque(array, i);
1769                     assertEquals(x, v, "getOpaque long value");
1770                 }
1771             }
1772         }
1773     }
1774 
1775 }
1776 
1777