blob: d5a264ade98889edab5f5e36225a42fd2d46911c [file] [log] [blame]
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001/*
2 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
Paul Sandoz1af28062016-04-26 18:30:00 -070026 * @bug 8154556
Paul Sandoz9fb30a32016-03-24 11:21:21 +010027 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsLong
28 * @run testng/othervm -Diters=20000 VarHandleTestByteArrayAsLong
29 * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAsLong
30 */
31
32import org.testng.annotations.DataProvider;
33import org.testng.annotations.Test;
34
35import java.lang.invoke.MethodHandles;
36import java.lang.invoke.VarHandle;
37import java.nio.ByteBuffer;
38import java.nio.ByteOrder;
39import java.util.ArrayList;
40import java.util.Arrays;
41import java.util.EnumSet;
42import java.util.List;
43
44import static org.testng.Assert.*;
45
46public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest {
47 static final int SIZE = Long.BYTES;
48
49 static final long VALUE_1 = 0x0102030405060708L;
50
51 static final long VALUE_2 = 0x1112131415161718L;
52
Paul Sandoz0bad4452016-05-18 18:46:14 +020053 static final long VALUE_3 = 0xFFFEFDFCFBFAF9F8L;
Paul Sandoz9fb30a32016-03-24 11:21:21 +010054
55
56 @Override
57 public void setupVarHandleSources() {
58 // Combinations of VarHandle byte[] or ByteBuffer
59 vhss = new ArrayList<>();
60 for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) {
Paul Sandoz1af28062016-04-26 18:30:00 -070061
62 ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN
63 ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
Paul Sandoz9fb30a32016-03-24 11:21:21 +010064 VarHandleSource aeh = new VarHandleSource(
Paul Sandoz1af28062016-04-26 18:30:00 -070065 MethodHandles.byteArrayViewVarHandle(long[].class, bo),
Paul Sandoz9fb30a32016-03-24 11:21:21 +010066 endianess, MemoryMode.READ_WRITE);
67 vhss.add(aeh);
68
69 VarHandleSource bbh = new VarHandleSource(
Paul Sandoz1af28062016-04-26 18:30:00 -070070 MethodHandles.byteBufferViewVarHandle(long[].class, bo),
Paul Sandoz9fb30a32016-03-24 11:21:21 +010071 endianess, MemoryMode.READ_WRITE);
72 vhss.add(bbh);
73 }
74 }
75
76
77 @Test(dataProvider = "varHandlesProvider")
78 public void testIsAccessModeSupported(VarHandleSource vhs) {
79 VarHandle vh = vhs.s;
80
Paul Sandoza7aff442016-04-13 15:05:48 +020081 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET));
82 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
Paul Sandoz9fb30a32016-03-24 11:21:21 +010083
Paul Sandoza7aff442016-04-13 15:05:48 +020084 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE));
85 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE));
86 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE));
87 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE));
88 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE));
89 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +010090
Paul Sandoza7aff442016-04-13 15:05:48 +020091 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET));
Paul Sandoz3f0273a2016-06-23 13:46:48 +020092 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE));
Paul Sandoza7aff442016-04-13 15:05:48 +020093 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
94 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
95 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
Paul Sandoze9556602016-04-29 13:46:19 -070096 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
Paul Sandoza7aff442016-04-13 15:05:48 +020097 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
98 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
Paul Sandoza7aff442016-04-13 15:05:48 +020099 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
Paul Sandoz82d48912016-09-01 10:16:57 -0700100 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE));
101 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100102
Paul Sandoza7aff442016-04-13 15:05:48 +0200103 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
Paul Sandoz82d48912016-09-01 10:16:57 -0700104 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE));
105 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE));
Paul Sandoza7aff442016-04-13 15:05:48 +0200106 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.ADD_AND_GET));
Paul Sandoz82d48912016-09-01 10:16:57 -0700107
108 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR));
109 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE));
110 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE));
111 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND));
112 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE));
113 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE));
114 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR));
115 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE));
116 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100117 }
118
119 @Test(dataProvider = "typesProvider")
120 public void testTypes(VarHandle vh, List<java.lang.Class<?>> pts) {
121 assertEquals(vh.varType(), long.class);
122
123 assertEquals(vh.coordinateTypes(), pts);
124
125 testTypes(vh);
126 }
127
128
129 @DataProvider
130 public Object[][] accessTestCaseProvider() throws Exception {
131 List<AccessTestCase<?>> cases = new ArrayList<>();
132
133 for (ByteArrayViewSource<?> bav : bavss) {
134 for (VarHandleSource vh : vhss) {
135 if (vh.matches(bav)) {
136 if (bav instanceof ByteArraySource) {
137 ByteArraySource bas = (ByteArraySource) bav;
138
139 cases.add(new VarHandleSourceAccessTestCase(
140 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
141 true));
142 cases.add(new VarHandleSourceAccessTestCase(
143 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
144 false));
145 cases.add(new VarHandleSourceAccessTestCase(
146 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bas, h),
147 false));
148 cases.add(new VarHandleSourceAccessTestCase(
149 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bas, h),
150 false));
151 }
152 else {
153 ByteBufferSource bbs = (ByteBufferSource) bav;
154
155 if (MemoryMode.READ_WRITE.isSet(bav.memoryModes)) {
156 cases.add(new VarHandleSourceAccessTestCase(
157 "read write", bav, vh, h -> testArrayReadWrite(bbs, h),
158 true));
159 }
160 else {
161 cases.add(new VarHandleSourceAccessTestCase(
162 "read only", bav, vh, h -> testArrayReadOnly(bbs, h),
163 true));
164 }
165
166 cases.add(new VarHandleSourceAccessTestCase(
167 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
168 false));
169 cases.add(new VarHandleSourceAccessTestCase(
170 "index out of bounds", bav, vh, h -> testArrayIndexOutOfBounds(bbs, h),
171 false));
172 cases.add(new VarHandleSourceAccessTestCase(
173 "misaligned access", bav, vh, h -> testArrayMisalignedAccess(bbs, h),
174 false));
175 }
176 }
177 }
178 }
179
180 // Work around issue with jtreg summary reporting which truncates
181 // the String result of Object.toString to 30 characters, hence
182 // the first dummy argument
183 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
184 }
185
186 @Test(dataProvider = "accessTestCaseProvider")
187 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
188 T t = atc.get();
189 int iters = atc.requiresLoop() ? ITERS : 1;
190 for (int c = 0; c < iters; c++) {
191 atc.testAccess(t);
192 }
193 }
194
195
196 static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
197 VarHandle vh = vhs.s;
198 byte[] array = bs.s;
199 int ci = 1;
200
201
Paul Sandoz82d48912016-09-01 10:16:57 -0700202
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100203 }
204
205 static void testArrayUnsupported(ByteBufferSource bs, VarHandleSource vhs) {
206 VarHandle vh = vhs.s;
207 ByteBuffer array = bs.s;
208 int ci = 0;
209 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
210
211 if (readOnly) {
212 checkROBE(() -> {
213 vh.set(array, ci, VALUE_1);
214 });
215 }
216
217 if (readOnly) {
218 checkROBE(() -> {
219 vh.setVolatile(array, ci, VALUE_1);
220 });
221
222 checkROBE(() -> {
223 vh.setRelease(array, ci, VALUE_1);
224 });
225
226 checkROBE(() -> {
227 vh.setOpaque(array, ci, VALUE_1);
228 });
229
230 checkROBE(() -> {
231 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
232 });
233
234 checkROBE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200235 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100236 });
237
238 checkROBE(() -> {
239 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
240 });
241
242 checkROBE(() -> {
243 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
244 });
245
246 checkROBE(() -> {
247 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
248 });
249
250 checkROBE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700251 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
252 });
253
254 checkROBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100255 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
256 });
257
258 checkROBE(() -> {
259 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
260 });
261
262 checkROBE(() -> {
263 long o = (long) vh.getAndSet(array, ci, VALUE_1);
264 });
Paul Sandoz44afe202016-05-17 12:06:41 +0200265
Paul Sandoz82d48912016-09-01 10:16:57 -0700266 checkROBE(() -> {
267 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
268 });
269
270 checkROBE(() -> {
271 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
272 });
273
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100274
275 checkROBE(() -> {
276 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
277 });
278
279 checkROBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700280 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
281 });
282
283 checkROBE(() -> {
284 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
285 });
286
287 checkROBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100288 long o = (long) vh.addAndGet(array, ci, VALUE_1);
289 });
Paul Sandoz82d48912016-09-01 10:16:57 -0700290
291 checkROBE(() -> {
292 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
293 });
294
295 checkROBE(() -> {
296 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
297 });
298
299 checkROBE(() -> {
300 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
301 });
302
303 checkROBE(() -> {
304 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
305 });
306
307 checkROBE(() -> {
308 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
309 });
310
311 checkROBE(() -> {
312 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
313 });
314
315 checkROBE(() -> {
316 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
317 });
318
319 checkROBE(() -> {
320 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
321 });
322
323 checkROBE(() -> {
324 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
325 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100326 }
327 else {
328 }
329 }
330
331
332 static void testArrayIndexOutOfBounds(ByteArraySource bs, VarHandleSource vhs) throws Throwable {
333 VarHandle vh = vhs.s;
334 byte[] array = bs.s;
335
336 int length = array.length - SIZE + 1;
337 for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) {
338 final int ci = i;
339
340 checkIOOBE(() -> {
341 long x = (long) vh.get(array, ci);
342 });
343
344 checkIOOBE(() -> {
345 vh.set(array, ci, VALUE_1);
346 });
347
348 checkIOOBE(() -> {
349 long x = (long) vh.getVolatile(array, ci);
350 });
351
352 checkIOOBE(() -> {
353 long x = (long) vh.getAcquire(array, ci);
354 });
355
356 checkIOOBE(() -> {
357 long x = (long) vh.getOpaque(array, ci);
358 });
359
360 checkIOOBE(() -> {
361 vh.setVolatile(array, ci, VALUE_1);
362 });
363
364 checkIOOBE(() -> {
365 vh.setRelease(array, ci, VALUE_1);
366 });
367
368 checkIOOBE(() -> {
369 vh.setOpaque(array, ci, VALUE_1);
370 });
371
372 checkIOOBE(() -> {
373 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
374 });
375
376 checkIOOBE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200377 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100378 });
379
380 checkIOOBE(() -> {
381 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
382 });
383
384 checkIOOBE(() -> {
385 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
386 });
387
388 checkIOOBE(() -> {
389 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
390 });
391
392 checkIOOBE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700393 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
394 });
395
396 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100397 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
398 });
399
400 checkIOOBE(() -> {
401 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
402 });
403
404 checkIOOBE(() -> {
405 long o = (long) vh.getAndSet(array, ci, VALUE_1);
406 });
407
408 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700409 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
410 });
411
412 checkIOOBE(() -> {
413 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
414 });
415
416 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100417 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
418 });
419
420 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700421 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
422 });
423
424 checkIOOBE(() -> {
425 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
426 });
427
428 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100429 long o = (long) vh.addAndGet(array, ci, VALUE_1);
430 });
431
Paul Sandoz82d48912016-09-01 10:16:57 -0700432 checkIOOBE(() -> {
433 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
434 });
435
436 checkIOOBE(() -> {
437 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
438 });
439
440 checkIOOBE(() -> {
441 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
442 });
443
444 checkIOOBE(() -> {
445 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
446 });
447
448 checkIOOBE(() -> {
449 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
450 });
451
452 checkIOOBE(() -> {
453 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
454 });
455
456 checkIOOBE(() -> {
457 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
458 });
459
460 checkIOOBE(() -> {
461 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
462 });
463
464 checkIOOBE(() -> {
465 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
466 });
467
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100468 }
469 }
470
471 static void testArrayIndexOutOfBounds(ByteBufferSource bs, VarHandleSource vhs) throws Throwable {
472 VarHandle vh = vhs.s;
473 ByteBuffer array = bs.s;
474
475 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
476
477 int length = array.limit() - SIZE + 1;
478 for (int i : new int[]{-1, Integer.MIN_VALUE, length, length + 1, Integer.MAX_VALUE}) {
479 final int ci = i;
480
481 checkIOOBE(() -> {
482 long x = (long) vh.get(array, ci);
483 });
484
485 if (!readOnly) {
486 checkIOOBE(() -> {
487 vh.set(array, ci, VALUE_1);
488 });
489 }
490
491 checkIOOBE(() -> {
492 long x = (long) vh.getVolatile(array, ci);
493 });
494
495 checkIOOBE(() -> {
496 long x = (long) vh.getAcquire(array, ci);
497 });
498
499 checkIOOBE(() -> {
500 long x = (long) vh.getOpaque(array, ci);
501 });
502
503 if (!readOnly) {
504 checkIOOBE(() -> {
505 vh.setVolatile(array, ci, VALUE_1);
506 });
507
508 checkIOOBE(() -> {
509 vh.setRelease(array, ci, VALUE_1);
510 });
511
512 checkIOOBE(() -> {
513 vh.setOpaque(array, ci, VALUE_1);
514 });
515
516 checkIOOBE(() -> {
517 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
518 });
519
520 checkIOOBE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200521 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100522 });
523
524 checkIOOBE(() -> {
525 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
526 });
527
528 checkIOOBE(() -> {
529 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
530 });
531
532 checkIOOBE(() -> {
533 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
534 });
535
536 checkIOOBE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700537 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
538 });
539
540 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100541 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
542 });
543
544 checkIOOBE(() -> {
545 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
546 });
547
548 checkIOOBE(() -> {
549 long o = (long) vh.getAndSet(array, ci, VALUE_1);
550 });
551
552 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700553 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
554 });
555
556 checkIOOBE(() -> {
557 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
558 });
559
560 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100561 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
562 });
563
564 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700565 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
566 });
567
568 checkIOOBE(() -> {
569 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
570 });
571
572 checkIOOBE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100573 long o = (long) vh.addAndGet(array, ci, VALUE_1);
574 });
Paul Sandoz82d48912016-09-01 10:16:57 -0700575
576 checkIOOBE(() -> {
577 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
578 });
579
580 checkIOOBE(() -> {
581 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
582 });
583
584 checkIOOBE(() -> {
585 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
586 });
587
588 checkIOOBE(() -> {
589 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
590 });
591
592 checkIOOBE(() -> {
593 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
594 });
595
596 checkIOOBE(() -> {
597 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
598 });
599
600 checkIOOBE(() -> {
601 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
602 });
603
604 checkIOOBE(() -> {
605 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
606 });
607
608 checkIOOBE(() -> {
609 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
610 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100611 }
612 }
613 }
614
615 static void testArrayMisalignedAccess(ByteArraySource bs, VarHandleSource vhs) throws Throwable {
616 VarHandle vh = vhs.s;
617 byte[] array = bs.s;
618
619 int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE);
620
621 int length = array.length - SIZE + 1;
622 for (int i = 0; i < length; i++) {
623 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
624 final int ci = i;
625
626 if (!iAligned) {
627 checkISE(() -> {
628 long x = (long) vh.getVolatile(array, ci);
629 });
630
631 checkISE(() -> {
632 long x = (long) vh.getAcquire(array, ci);
633 });
634
635 checkISE(() -> {
636 long x = (long) vh.getOpaque(array, ci);
637 });
638
639 checkISE(() -> {
640 vh.setVolatile(array, ci, VALUE_1);
641 });
642
643 checkISE(() -> {
644 vh.setRelease(array, ci, VALUE_1);
645 });
646
647 checkISE(() -> {
648 vh.setOpaque(array, ci, VALUE_1);
649 });
650
651 checkISE(() -> {
652 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
653 });
654
655 checkISE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200656 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100657 });
658
659 checkISE(() -> {
660 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
661 });
662
663 checkISE(() -> {
664 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
665 });
666
667 checkISE(() -> {
668 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
669 });
670
671 checkISE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700672 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
673 });
674
675 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100676 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
677 });
678
679 checkISE(() -> {
680 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
681 });
682
683 checkISE(() -> {
684 long o = (long) vh.getAndSet(array, ci, VALUE_1);
685 });
686
687 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700688 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
689 });
690
691 checkISE(() -> {
692 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
693 });
694
695 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100696 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
697 });
698
699 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700700 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
701 });
702
703 checkISE(() -> {
704 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
705 });
706
707 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100708 long o = (long) vh.addAndGet(array, ci, VALUE_1);
709 });
710
Paul Sandoz82d48912016-09-01 10:16:57 -0700711 checkISE(() -> {
712 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
713 });
714
715 checkISE(() -> {
716 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
717 });
718
719 checkISE(() -> {
720 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
721 });
722
723 checkISE(() -> {
724 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
725 });
726
727 checkISE(() -> {
728 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
729 });
730
731 checkISE(() -> {
732 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
733 });
734
735 checkISE(() -> {
736 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
737 });
738
739 checkISE(() -> {
740 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
741 });
742
743 checkISE(() -> {
744 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
745 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100746 }
747 }
748 }
749
750 static void testArrayMisalignedAccess(ByteBufferSource bs, VarHandleSource vhs) throws Throwable {
751 VarHandle vh = vhs.s;
752 ByteBuffer array = bs.s;
753
754 boolean readOnly = MemoryMode.READ_ONLY.isSet(bs.memoryModes);
755 int misalignmentAtZero = array.alignmentOffset(0, SIZE);
756
757 int length = array.limit() - SIZE + 1;
758 for (int i = 0; i < length; i++) {
759 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
760 final int ci = i;
761
762 if (!iAligned) {
763 checkISE(() -> {
764 long x = (long) vh.getVolatile(array, ci);
765 });
766
767 checkISE(() -> {
768 long x = (long) vh.getAcquire(array, ci);
769 });
770
771 checkISE(() -> {
772 long x = (long) vh.getOpaque(array, ci);
773 });
774
775 if (!readOnly) {
776 checkISE(() -> {
777 vh.setVolatile(array, ci, VALUE_1);
778 });
779
780 checkISE(() -> {
781 vh.setRelease(array, ci, VALUE_1);
782 });
783
784 checkISE(() -> {
785 vh.setOpaque(array, ci, VALUE_1);
786 });
787
788 checkISE(() -> {
789 boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
790 });
791
792 checkISE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200793 long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100794 });
795
796 checkISE(() -> {
797 long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
798 });
799
800 checkISE(() -> {
801 long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
802 });
803
804 checkISE(() -> {
805 boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
806 });
807
808 checkISE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700809 boolean r = vh.weakCompareAndSetVolatile(array, ci, VALUE_1, VALUE_2);
810 });
811
812 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100813 boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
814 });
815
816 checkISE(() -> {
817 boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
818 });
819
820 checkISE(() -> {
821 long o = (long) vh.getAndSet(array, ci, VALUE_1);
822 });
823
824 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700825 long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
826 });
827
828 checkISE(() -> {
829 long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
830 });
831
832 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100833 long o = (long) vh.getAndAdd(array, ci, VALUE_1);
834 });
835
836 checkISE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -0700837 long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
838 });
839
840 checkISE(() -> {
841 long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
842 });
843
844 checkISE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100845 long o = (long) vh.addAndGet(array, ci, VALUE_1);
846 });
Paul Sandoz82d48912016-09-01 10:16:57 -0700847
848 checkISE(() -> {
849 long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
850 });
851
852 checkISE(() -> {
853 long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
854 });
855
856 checkISE(() -> {
857 long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
858 });
859
860 checkISE(() -> {
861 long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
862 });
863
864 checkISE(() -> {
865 long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
866 });
867
868 checkISE(() -> {
869 long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
870 });
871
872 checkISE(() -> {
873 long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
874 });
875
876 checkISE(() -> {
877 long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
878 });
879
880 checkISE(() -> {
881 long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
882 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100883 }
884 }
885 }
886 }
887
888 static void testArrayReadWrite(ByteArraySource bs, VarHandleSource vhs) {
889 VarHandle vh = vhs.s;
890 byte[] array = bs.s;
891
892 int misalignmentAtZero = ByteBuffer.wrap(array).alignmentOffset(0, SIZE);
893
894 bs.fill((byte) 0xff);
895 int length = array.length - SIZE + 1;
896 for (int i = 0; i < length; i++) {
897 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
898
899 // Plain
900 {
901 vh.set(array, i, VALUE_1);
902 long x = (long) vh.get(array, i);
903 assertEquals(x, VALUE_1, "get long value");
904 }
905
906
907 if (iAligned) {
908 // Volatile
909 {
910 vh.setVolatile(array, i, VALUE_2);
911 long x = (long) vh.getVolatile(array, i);
912 assertEquals(x, VALUE_2, "setVolatile long value");
913 }
914
915 // Lazy
916 {
917 vh.setRelease(array, i, VALUE_1);
918 long x = (long) vh.getAcquire(array, i);
919 assertEquals(x, VALUE_1, "setRelease long value");
920 }
921
922 // Opaque
923 {
924 vh.setOpaque(array, i, VALUE_2);
925 long x = (long) vh.getOpaque(array, i);
926 assertEquals(x, VALUE_2, "setOpaque long value");
927 }
928
929 vh.set(array, i, VALUE_1);
930
931 // Compare
932 {
933 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2);
934 assertEquals(r, true, "success compareAndSet long");
935 long x = (long) vh.get(array, i);
936 assertEquals(x, VALUE_2, "success compareAndSet long value");
937 }
938
939 {
940 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3);
941 assertEquals(r, false, "failing compareAndSet long");
942 long x = (long) vh.get(array, i);
943 assertEquals(x, VALUE_2, "failing compareAndSet long value");
944 }
945
946 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200947 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_1);
948 assertEquals(r, VALUE_2, "success compareAndExchange long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100949 long x = (long) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200950 assertEquals(x, VALUE_1, "success compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100951 }
952
953 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200954 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_3);
955 assertEquals(r, VALUE_1, "failing compareAndExchange long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100956 long x = (long) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200957 assertEquals(x, VALUE_1, "failing compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100958 }
959
960 {
961 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2);
962 assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long");
963 long x = (long) vh.get(array, i);
964 assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value");
965 }
966
967 {
968 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3);
969 assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long");
970 long x = (long) vh.get(array, i);
971 assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value");
972 }
973
974 {
975 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1);
976 assertEquals(r, VALUE_2, "success compareAndExchangeRelease long");
977 long x = (long) vh.get(array, i);
978 assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value");
979 }
980
981 {
982 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3);
983 assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long");
984 long x = (long) vh.get(array, i);
985 assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value");
986 }
987
988 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300989 boolean success = false;
990 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
991 success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
992 }
993 assertEquals(success, true, "weakCompareAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100994 long x = (long) vh.get(array, i);
995 assertEquals(x, VALUE_2, "weakCompareAndSet long value");
996 }
997
998 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300999 boolean success = false;
1000 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1001 success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
1002 }
1003 assertEquals(success, true, "weakCompareAndSetAcquire long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001004 long x = (long) vh.get(array, i);
1005 assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
1006 }
1007
1008 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +03001009 boolean success = false;
1010 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1011 success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
1012 }
1013 assertEquals(success, true, "weakCompareAndSetRelease long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001014 long x = (long) vh.get(array, i);
1015 assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
1016 }
1017
Paul Sandoze9556602016-04-29 13:46:19 -07001018 {
1019 boolean r = vh.weakCompareAndSetVolatile(array, i, VALUE_2, VALUE_1);
1020 assertEquals(r, true, "weakCompareAndSetVolatile long");
1021 long x = (long) vh.get(array, i);
1022 assertEquals(x, VALUE_1, "weakCompareAndSetVolatile long value");
1023 }
1024
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001025 // Compare set and get
1026 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001027 vh.set(array, i, VALUE_1);
1028
Paul Sandoze9556602016-04-29 13:46:19 -07001029 long o = (long) vh.getAndSet(array, i, VALUE_2);
1030 assertEquals(o, VALUE_1, "getAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001031 long x = (long) vh.get(array, i);
Paul Sandoze9556602016-04-29 13:46:19 -07001032 assertEquals(x, VALUE_2, "getAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001033 }
1034
Paul Sandoz82d48912016-09-01 10:16:57 -07001035 {
1036 vh.set(array, i, VALUE_1);
1037
1038 long o = (long) vh.getAndSetAcquire(array, i, VALUE_2);
1039 assertEquals(o, VALUE_1, "getAndSetAcquire long");
1040 long x = (long) vh.get(array, i);
1041 assertEquals(x, VALUE_2, "getAndSetAcquire long value");
1042 }
1043
1044 {
1045 vh.set(array, i, VALUE_1);
1046
1047 long o = (long) vh.getAndSetRelease(array, i, VALUE_2);
1048 assertEquals(o, VALUE_1, "getAndSetRelease long");
1049 long x = (long) vh.get(array, i);
1050 assertEquals(x, VALUE_2, "getAndSetRelease long value");
1051 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001052
1053 // get and add, add and get
1054 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001055 vh.set(array, i, VALUE_1);
1056
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001057 long o = (long) vh.getAndAdd(array, i, VALUE_3);
1058 assertEquals(o, VALUE_1, "getAndAdd long");
1059 long c = (long) vh.addAndGet(array, i, VALUE_3);
1060 assertEquals(c, VALUE_1 + VALUE_3 + VALUE_3, "getAndAdd long value");
1061 }
Paul Sandoz82d48912016-09-01 10:16:57 -07001062
1063 {
1064 vh.set(array, i, VALUE_1);
1065
1066 long o = (long) vh.getAndAddAcquire(array, i, VALUE_2);
1067 assertEquals(o, VALUE_1, "getAndAddAcquire long");
1068 long x = (long) vh.get(array, i);
1069 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddAcquire long value");
1070 }
1071
1072 {
1073 vh.set(array, i, VALUE_1);
1074
1075 long o = (long) vh.getAndAddRelease(array, i, VALUE_2);
1076 assertEquals(o, VALUE_1, "getAndAddRelease long");
1077 long x = (long) vh.get(array, i);
1078 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddRelease long value");
1079 }
1080
1081 // get and bitwise or
1082 {
1083 vh.set(array, i, VALUE_1);
1084
1085 long o = (long) vh.getAndBitwiseOr(array, i, VALUE_2);
1086 assertEquals(o, VALUE_1, "getAndBitwiseOr long");
1087 long x = (long) vh.get(array, i);
1088 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOr long value");
1089 }
1090
1091 {
1092 vh.set(array, i, VALUE_1);
1093
1094 long o = (long) vh.getAndBitwiseOrAcquire(array, i, VALUE_2);
1095 assertEquals(o, VALUE_1, "getAndBitwiseOrAcquire long");
1096 long x = (long) vh.get(array, i);
1097 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrAcquire long value");
1098 }
1099
1100 {
1101 vh.set(array, i, VALUE_1);
1102
1103 long o = (long) vh.getAndBitwiseOrRelease(array, i, VALUE_2);
1104 assertEquals(o, VALUE_1, "getAndBitwiseOrRelease long");
1105 long x = (long) vh.get(array, i);
1106 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrRelease long value");
1107 }
1108
1109 // get and bitwise and
1110 {
1111 vh.set(array, i, VALUE_1);
1112
1113 long o = (long) vh.getAndBitwiseAnd(array, i, VALUE_2);
1114 assertEquals(o, VALUE_1, "getAndBitwiseAnd long");
1115 long x = (long) vh.get(array, i);
1116 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAnd long value");
1117 }
1118
1119 {
1120 vh.set(array, i, VALUE_1);
1121
1122 long o = (long) vh.getAndBitwiseAndAcquire(array, i, VALUE_2);
1123 assertEquals(o, VALUE_1, "getAndBitwiseAndAcquire long");
1124 long x = (long) vh.get(array, i);
1125 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndAcquire long value");
1126 }
1127
1128 {
1129 vh.set(array, i, VALUE_1);
1130
1131 long o = (long) vh.getAndBitwiseAndRelease(array, i, VALUE_2);
1132 assertEquals(o, VALUE_1, "getAndBitwiseAndRelease long");
1133 long x = (long) vh.get(array, i);
1134 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndRelease long value");
1135 }
1136
1137 // get and bitwise xor
1138 {
1139 vh.set(array, i, VALUE_1);
1140
1141 long o = (long) vh.getAndBitwiseXor(array, i, VALUE_2);
1142 assertEquals(o, VALUE_1, "getAndBitwiseXor long");
1143 long x = (long) vh.get(array, i);
1144 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXor long value");
1145 }
1146
1147 {
1148 vh.set(array, i, VALUE_1);
1149
1150 long o = (long) vh.getAndBitwiseXorAcquire(array, i, VALUE_2);
1151 assertEquals(o, VALUE_1, "getAndBitwiseXorAcquire long");
1152 long x = (long) vh.get(array, i);
1153 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorAcquire long value");
1154 }
1155
1156 {
1157 vh.set(array, i, VALUE_1);
1158
1159 long o = (long) vh.getAndBitwiseXorRelease(array, i, VALUE_2);
1160 assertEquals(o, VALUE_1, "getAndBitwiseXorRelease long");
1161 long x = (long) vh.get(array, i);
1162 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorRelease long value");
1163 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001164 }
1165 }
1166 }
1167
1168
1169 static void testArrayReadWrite(ByteBufferSource bs, VarHandleSource vhs) {
1170 VarHandle vh = vhs.s;
1171 ByteBuffer array = bs.s;
1172
1173 int misalignmentAtZero = array.alignmentOffset(0, SIZE);
1174
1175 bs.fill((byte) 0xff);
1176 int length = array.limit() - SIZE + 1;
1177 for (int i = 0; i < length; i++) {
1178 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
1179
1180 // Plain
1181 {
1182 vh.set(array, i, VALUE_1);
1183 long x = (long) vh.get(array, i);
1184 assertEquals(x, VALUE_1, "get long value");
1185 }
1186
1187 if (iAligned) {
1188 // Volatile
1189 {
1190 vh.setVolatile(array, i, VALUE_2);
1191 long x = (long) vh.getVolatile(array, i);
1192 assertEquals(x, VALUE_2, "setVolatile long value");
1193 }
1194
1195 // Lazy
1196 {
1197 vh.setRelease(array, i, VALUE_1);
1198 long x = (long) vh.getAcquire(array, i);
1199 assertEquals(x, VALUE_1, "setRelease long value");
1200 }
1201
1202 // Opaque
1203 {
1204 vh.setOpaque(array, i, VALUE_2);
1205 long x = (long) vh.getOpaque(array, i);
1206 assertEquals(x, VALUE_2, "setOpaque long value");
1207 }
1208
1209 vh.set(array, i, VALUE_1);
1210
1211 // Compare
1212 {
1213 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_2);
1214 assertEquals(r, true, "success compareAndSet long");
1215 long x = (long) vh.get(array, i);
1216 assertEquals(x, VALUE_2, "success compareAndSet long value");
1217 }
1218
1219 {
1220 boolean r = vh.compareAndSet(array, i, VALUE_1, VALUE_3);
1221 assertEquals(r, false, "failing compareAndSet long");
1222 long x = (long) vh.get(array, i);
1223 assertEquals(x, VALUE_2, "failing compareAndSet long value");
1224 }
1225
1226 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001227 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_1);
1228 assertEquals(r, VALUE_2, "success compareAndExchange long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001229 long x = (long) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001230 assertEquals(x, VALUE_1, "success compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001231 }
1232
1233 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001234 long r = (long) vh.compareAndExchange(array, i, VALUE_2, VALUE_3);
1235 assertEquals(r, VALUE_1, "failing compareAndExchange long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001236 long x = (long) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001237 assertEquals(x, VALUE_1, "failing compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001238 }
1239
1240 {
1241 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_2);
1242 assertEquals(r, VALUE_1, "success compareAndExchangeAcquire long");
1243 long x = (long) vh.get(array, i);
1244 assertEquals(x, VALUE_2, "success compareAndExchangeAcquire long value");
1245 }
1246
1247 {
1248 long r = (long) vh.compareAndExchangeAcquire(array, i, VALUE_1, VALUE_3);
1249 assertEquals(r, VALUE_2, "failing compareAndExchangeAcquire long");
1250 long x = (long) vh.get(array, i);
1251 assertEquals(x, VALUE_2, "failing compareAndExchangeAcquire long value");
1252 }
1253
1254 {
1255 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_1);
1256 assertEquals(r, VALUE_2, "success compareAndExchangeRelease long");
1257 long x = (long) vh.get(array, i);
1258 assertEquals(x, VALUE_1, "success compareAndExchangeRelease long value");
1259 }
1260
1261 {
1262 long r = (long) vh.compareAndExchangeRelease(array, i, VALUE_2, VALUE_3);
1263 assertEquals(r, VALUE_1, "failing compareAndExchangeRelease long");
1264 long x = (long) vh.get(array, i);
1265 assertEquals(x, VALUE_1, "failing compareAndExchangeRelease long value");
1266 }
1267
1268 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +03001269 boolean success = false;
1270 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1271 success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
1272 }
1273 assertEquals(success, true, "weakCompareAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001274 long x = (long) vh.get(array, i);
1275 assertEquals(x, VALUE_2, "weakCompareAndSet long value");
1276 }
1277
1278 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +03001279 boolean success = false;
1280 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1281 success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
1282 }
1283 assertEquals(success, true, "weakCompareAndSetAcquire long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001284 long x = (long) vh.get(array, i);
1285 assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
1286 }
1287
1288 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +03001289 boolean success = false;
1290 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1291 success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
1292 }
1293 assertEquals(success, true, "weakCompareAndSetRelease long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001294 long x = (long) vh.get(array, i);
1295 assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
1296 }
1297
Paul Sandoze9556602016-04-29 13:46:19 -07001298 {
1299 boolean r = vh.weakCompareAndSetVolatile(array, i, VALUE_2, VALUE_1);
1300 assertEquals(r, true, "weakCompareAndSetVolatile long");
1301 long x = (long) vh.get(array, i);
1302 assertEquals(x, VALUE_1, "weakCompareAndSetVolatile long value");
1303 }
1304
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001305 // Compare set and get
1306 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001307 vh.set(array, i, VALUE_1);
1308
Paul Sandoze9556602016-04-29 13:46:19 -07001309 long o = (long) vh.getAndSet(array, i, VALUE_2);
1310 assertEquals(o, VALUE_1, "getAndSet long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001311 long x = (long) vh.get(array, i);
Paul Sandoze9556602016-04-29 13:46:19 -07001312 assertEquals(x, VALUE_2, "getAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001313 }
1314
Paul Sandoz82d48912016-09-01 10:16:57 -07001315 {
1316 vh.set(array, i, VALUE_1);
1317
1318 long o = (long) vh.getAndSetAcquire(array, i, VALUE_2);
1319 assertEquals(o, VALUE_1, "getAndSetAcquire long");
1320 long x = (long) vh.get(array, i);
1321 assertEquals(x, VALUE_2, "getAndSetAcquire long value");
1322 }
1323
1324 {
1325 vh.set(array, i, VALUE_1);
1326
1327 long o = (long) vh.getAndSetRelease(array, i, VALUE_2);
1328 assertEquals(o, VALUE_1, "getAndSetRelease long");
1329 long x = (long) vh.get(array, i);
1330 assertEquals(x, VALUE_2, "getAndSetRelease long value");
1331 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001332
1333 // get and add, add and get
1334 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001335 vh.set(array, i, VALUE_1);
1336
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001337 long o = (long) vh.getAndAdd(array, i, VALUE_3);
1338 assertEquals(o, VALUE_1, "getAndAdd long");
1339 long c = (long) vh.addAndGet(array, i, VALUE_3);
1340 assertEquals(c, VALUE_1 + VALUE_3 + VALUE_3, "getAndAdd long value");
1341 }
Paul Sandoz82d48912016-09-01 10:16:57 -07001342
1343 {
1344 vh.set(array, i, VALUE_1);
1345
1346 long o = (long) vh.getAndAddAcquire(array, i, VALUE_2);
1347 assertEquals(o, VALUE_1, "getAndAddAcquire long");
1348 long x = (long) vh.get(array, i);
1349 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddAcquire long value");
1350 }
1351
1352 {
1353 vh.set(array, i, VALUE_1);
1354
1355 long o = (long) vh.getAndAddRelease(array, i, VALUE_2);
1356 assertEquals(o, VALUE_1, "getAndAddRelease long");
1357 long x = (long) vh.get(array, i);
1358 assertEquals(x, VALUE_1 + VALUE_2, "getAndAddRelease long value");
1359 }
1360
1361 // get and bitwise or
1362 {
1363 vh.set(array, i, VALUE_1);
1364
1365 long o = (long) vh.getAndBitwiseOr(array, i, VALUE_2);
1366 assertEquals(o, VALUE_1, "getAndBitwiseOr long");
1367 long x = (long) vh.get(array, i);
1368 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOr long value");
1369 }
1370
1371 {
1372 vh.set(array, i, VALUE_1);
1373
1374 long o = (long) vh.getAndBitwiseOrAcquire(array, i, VALUE_2);
1375 assertEquals(o, VALUE_1, "getAndBitwiseOrAcquire long");
1376 long x = (long) vh.get(array, i);
1377 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrAcquire long value");
1378 }
1379
1380 {
1381 vh.set(array, i, VALUE_1);
1382
1383 long o = (long) vh.getAndBitwiseOrRelease(array, i, VALUE_2);
1384 assertEquals(o, VALUE_1, "getAndBitwiseOrRelease long");
1385 long x = (long) vh.get(array, i);
1386 assertEquals(x, VALUE_1 | VALUE_2, "getAndBitwiseOrRelease long value");
1387 }
1388
1389 // get and bitwise and
1390 {
1391 vh.set(array, i, VALUE_1);
1392
1393 long o = (long) vh.getAndBitwiseAnd(array, i, VALUE_2);
1394 assertEquals(o, VALUE_1, "getAndBitwiseAnd long");
1395 long x = (long) vh.get(array, i);
1396 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAnd long value");
1397 }
1398
1399 {
1400 vh.set(array, i, VALUE_1);
1401
1402 long o = (long) vh.getAndBitwiseAndAcquire(array, i, VALUE_2);
1403 assertEquals(o, VALUE_1, "getAndBitwiseAndAcquire long");
1404 long x = (long) vh.get(array, i);
1405 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndAcquire long value");
1406 }
1407
1408 {
1409 vh.set(array, i, VALUE_1);
1410
1411 long o = (long) vh.getAndBitwiseAndRelease(array, i, VALUE_2);
1412 assertEquals(o, VALUE_1, "getAndBitwiseAndRelease long");
1413 long x = (long) vh.get(array, i);
1414 assertEquals(x, VALUE_1 & VALUE_2, "getAndBitwiseAndRelease long value");
1415 }
1416
1417 // get and bitwise xor
1418 {
1419 vh.set(array, i, VALUE_1);
1420
1421 long o = (long) vh.getAndBitwiseXor(array, i, VALUE_2);
1422 assertEquals(o, VALUE_1, "getAndBitwiseXor long");
1423 long x = (long) vh.get(array, i);
1424 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXor long value");
1425 }
1426
1427 {
1428 vh.set(array, i, VALUE_1);
1429
1430 long o = (long) vh.getAndBitwiseXorAcquire(array, i, VALUE_2);
1431 assertEquals(o, VALUE_1, "getAndBitwiseXorAcquire long");
1432 long x = (long) vh.get(array, i);
1433 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorAcquire long value");
1434 }
1435
1436 {
1437 vh.set(array, i, VALUE_1);
1438
1439 long o = (long) vh.getAndBitwiseXorRelease(array, i, VALUE_2);
1440 assertEquals(o, VALUE_1, "getAndBitwiseXorRelease long");
1441 long x = (long) vh.get(array, i);
1442 assertEquals(x, VALUE_1 ^ VALUE_2, "getAndBitwiseXorRelease long value");
1443 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001444 }
1445 }
1446 }
1447
1448 static void testArrayReadOnly(ByteBufferSource bs, VarHandleSource vhs) {
1449 VarHandle vh = vhs.s;
1450 ByteBuffer array = bs.s;
1451
1452 int misalignmentAtZero = array.alignmentOffset(0, SIZE);
1453
1454 ByteBuffer bb = ByteBuffer.allocate(SIZE);
1455 bb.order(MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes) ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN);
1456 bs.fill(bb.putLong(0, VALUE_2).array());
1457
1458 int length = array.limit() - SIZE + 1;
1459 for (int i = 0; i < length; i++) {
1460 boolean iAligned = ((i + misalignmentAtZero) & (SIZE - 1)) == 0;
1461
1462 long v = MemoryMode.BIG_ENDIAN.isSet(vhs.memoryModes)
1463 ? rotateLeft(VALUE_2, (i % SIZE) << 3)
1464 : rotateRight(VALUE_2, (i % SIZE) << 3);
1465 // Plain
1466 {
1467 long x = (long) vh.get(array, i);
1468 assertEquals(x, v, "get long value");
1469 }
1470
1471 if (iAligned) {
1472 // Volatile
1473 {
1474 long x = (long) vh.getVolatile(array, i);
1475 assertEquals(x, v, "getVolatile long value");
1476 }
1477
1478 // Lazy
1479 {
1480 long x = (long) vh.getAcquire(array, i);
1481 assertEquals(x, v, "getRelease long value");
1482 }
1483
1484 // Opaque
1485 {
1486 long x = (long) vh.getOpaque(array, i);
1487 assertEquals(x, v, "getOpaque long value");
1488 }
1489 }
1490 }
1491 }
1492
1493}
1494