blob: be79776202bbae3399d3e48098f0548685903768 [file] [log] [blame]
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001/*
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @run testng/othervm -Diters=10 -Xint VarHandleTestAccessByte
27 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestAccessByte
28 * @run testng/othervm -Diters=20000 VarHandleTestAccessByte
29 * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestAccessByte
30 */
31
32import org.testng.annotations.BeforeClass;
33import org.testng.annotations.DataProvider;
34import org.testng.annotations.Test;
35
36import java.lang.invoke.MethodHandles;
37import java.lang.invoke.VarHandle;
38import java.util.ArrayList;
39import java.util.Arrays;
40import java.util.List;
41
42import static org.testng.Assert.*;
43
44public class VarHandleTestAccessByte extends VarHandleBaseTest {
Aleksey Shipileve6632062016-06-15 11:20:15 +030045 static final byte static_final_v = (byte)0x01;
Paul Sandoz9fb30a32016-03-24 11:21:21 +010046
47 static byte static_v;
48
Aleksey Shipileve6632062016-06-15 11:20:15 +030049 final byte final_v = (byte)0x01;
Paul Sandoz9fb30a32016-03-24 11:21:21 +010050
51 byte v;
52
53 VarHandle vhFinalField;
54
55 VarHandle vhField;
56
57 VarHandle vhStaticField;
58
59 VarHandle vhStaticFinalField;
60
61 VarHandle vhArray;
62
63 @BeforeClass
64 public void setup() throws Exception {
65 vhFinalField = MethodHandles.lookup().findVarHandle(
66 VarHandleTestAccessByte.class, "final_v", byte.class);
67
68 vhField = MethodHandles.lookup().findVarHandle(
69 VarHandleTestAccessByte.class, "v", byte.class);
70
71 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
72 VarHandleTestAccessByte.class, "static_final_v", byte.class);
73
74 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
75 VarHandleTestAccessByte.class, "static_v", byte.class);
76
77 vhArray = MethodHandles.arrayElementVarHandle(byte[].class);
78 }
79
80
81 @DataProvider
82 public Object[][] varHandlesProvider() throws Exception {
83 List<VarHandle> vhs = new ArrayList<>();
84 vhs.add(vhField);
85 vhs.add(vhStaticField);
86 vhs.add(vhArray);
87
88 return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new);
89 }
90
91 @Test(dataProvider = "varHandlesProvider")
92 public void testIsAccessModeSupported(VarHandle vh) {
Paul Sandoza7aff442016-04-13 15:05:48 +020093 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET));
94 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
95 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE));
96 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE));
97 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE));
98 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE));
99 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE));
100 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100101
Aleksey Shipileve6632062016-06-15 11:20:15 +0300102 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET));
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200103 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE));
Aleksey Shipileve6632062016-06-15 11:20:15 +0300104 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
105 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700106 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN));
Aleksey Shipileve6632062016-06-15 11:20:15 +0300107 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
Aleksey Shipileve6632062016-06-15 11:20:15 +0300108 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
109 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
110 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
Paul Sandoz82d48912016-09-01 10:16:57 -0700111 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE));
112 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100113
Aleksey Shipileve6632062016-06-15 11:20:15 +0300114 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
Paul Sandoz82d48912016-09-01 10:16:57 -0700115 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE));
116 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE));
Paul Sandoz82d48912016-09-01 10:16:57 -0700117
118 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR));
119 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE));
120 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE));
121 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND));
122 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE));
123 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE));
124 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR));
125 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE));
126 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100127 }
128
129
130 @DataProvider
131 public Object[][] typesProvider() throws Exception {
132 List<Object[]> types = new ArrayList<>();
133 types.add(new Object[] {vhField, Arrays.asList(VarHandleTestAccessByte.class)});
134 types.add(new Object[] {vhStaticField, Arrays.asList()});
135 types.add(new Object[] {vhArray, Arrays.asList(byte[].class, int.class)});
136
137 return types.stream().toArray(Object[][]::new);
138 }
139
140 @Test(dataProvider = "typesProvider")
141 public void testTypes(VarHandle vh, List<Class<?>> pts) {
142 assertEquals(vh.varType(), byte.class);
143
144 assertEquals(vh.coordinateTypes(), pts);
145
146 testTypes(vh);
147 }
148
149
150 @Test
151 public void testLookupInstanceToStatic() {
152 checkIAE("Lookup of static final field to instance final field", () -> {
153 MethodHandles.lookup().findStaticVarHandle(
154 VarHandleTestAccessByte.class, "final_v", byte.class);
155 });
156
157 checkIAE("Lookup of static field to instance field", () -> {
158 MethodHandles.lookup().findStaticVarHandle(
159 VarHandleTestAccessByte.class, "v", byte.class);
160 });
161 }
162
163 @Test
164 public void testLookupStaticToInstance() {
165 checkIAE("Lookup of instance final field to static final field", () -> {
166 MethodHandles.lookup().findVarHandle(
167 VarHandleTestAccessByte.class, "static_final_v", byte.class);
168 });
169
170 checkIAE("Lookup of instance field to static field", () -> {
171 vhStaticField = MethodHandles.lookup().findVarHandle(
172 VarHandleTestAccessByte.class, "static_v", byte.class);
173 });
174 }
175
176
177 @DataProvider
178 public Object[][] accessTestCaseProvider() throws Exception {
179 List<AccessTestCase<?>> cases = new ArrayList<>();
180
181 cases.add(new VarHandleAccessTestCase("Instance final field",
182 vhFinalField, vh -> testInstanceFinalField(this, vh)));
183 cases.add(new VarHandleAccessTestCase("Instance final field unsupported",
184 vhFinalField, vh -> testInstanceFinalFieldUnsupported(this, vh),
185 false));
186
187 cases.add(new VarHandleAccessTestCase("Static final field",
188 vhStaticFinalField, VarHandleTestAccessByte::testStaticFinalField));
189 cases.add(new VarHandleAccessTestCase("Static final field unsupported",
190 vhStaticFinalField, VarHandleTestAccessByte::testStaticFinalFieldUnsupported,
191 false));
192
193 cases.add(new VarHandleAccessTestCase("Instance field",
194 vhField, vh -> testInstanceField(this, vh)));
195 cases.add(new VarHandleAccessTestCase("Instance field unsupported",
196 vhField, vh -> testInstanceFieldUnsupported(this, vh),
197 false));
198
199 cases.add(new VarHandleAccessTestCase("Static field",
200 vhStaticField, VarHandleTestAccessByte::testStaticField));
201 cases.add(new VarHandleAccessTestCase("Static field unsupported",
202 vhStaticField, VarHandleTestAccessByte::testStaticFieldUnsupported,
203 false));
204
205 cases.add(new VarHandleAccessTestCase("Array",
206 vhArray, VarHandleTestAccessByte::testArray));
207 cases.add(new VarHandleAccessTestCase("Array unsupported",
208 vhArray, VarHandleTestAccessByte::testArrayUnsupported,
209 false));
210 cases.add(new VarHandleAccessTestCase("Array index out of bounds",
211 vhArray, VarHandleTestAccessByte::testArrayIndexOutOfBounds,
212 false));
213
214 // Work around issue with jtreg summary reporting which truncates
215 // the String result of Object.toString to 30 characters, hence
216 // the first dummy argument
217 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
218 }
219
220 @Test(dataProvider = "accessTestCaseProvider")
221 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
222 T t = atc.get();
223 int iters = atc.requiresLoop() ? ITERS : 1;
224 for (int c = 0; c < iters; c++) {
225 atc.testAccess(t);
226 }
227 }
228
229
230
231
232 static void testInstanceFinalField(VarHandleTestAccessByte recv, VarHandle vh) {
233 // Plain
234 {
235 byte x = (byte) vh.get(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300236 assertEquals(x, (byte)0x01, "get byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100237 }
238
239
240 // Volatile
241 {
242 byte x = (byte) vh.getVolatile(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300243 assertEquals(x, (byte)0x01, "getVolatile byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100244 }
245
246 // Lazy
247 {
248 byte x = (byte) vh.getAcquire(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300249 assertEquals(x, (byte)0x01, "getRelease byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100250 }
251
252 // Opaque
253 {
254 byte x = (byte) vh.getOpaque(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300255 assertEquals(x, (byte)0x01, "getOpaque byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100256 }
257 }
258
259 static void testInstanceFinalFieldUnsupported(VarHandleTestAccessByte recv, VarHandle vh) {
260 checkUOE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300261 vh.set(recv, (byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100262 });
263
264 checkUOE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300265 vh.setVolatile(recv, (byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100266 });
267
268 checkUOE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300269 vh.setRelease(recv, (byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100270 });
271
272 checkUOE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300273 vh.setOpaque(recv, (byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100274 });
275
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100276
Paul Sandoz82d48912016-09-01 10:16:57 -0700277
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100278 }
279
280
281 static void testStaticFinalField(VarHandle vh) {
282 // Plain
283 {
284 byte x = (byte) vh.get();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300285 assertEquals(x, (byte)0x01, "get byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100286 }
287
288
289 // Volatile
290 {
291 byte x = (byte) vh.getVolatile();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300292 assertEquals(x, (byte)0x01, "getVolatile byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100293 }
294
295 // Lazy
296 {
297 byte x = (byte) vh.getAcquire();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300298 assertEquals(x, (byte)0x01, "getRelease byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100299 }
300
301 // Opaque
302 {
303 byte x = (byte) vh.getOpaque();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300304 assertEquals(x, (byte)0x01, "getOpaque byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100305 }
306 }
307
308 static void testStaticFinalFieldUnsupported(VarHandle vh) {
309 checkUOE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300310 vh.set((byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100311 });
312
313 checkUOE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300314 vh.setVolatile((byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100315 });
316
317 checkUOE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300318 vh.setRelease((byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100319 });
320
321 checkUOE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300322 vh.setOpaque((byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100323 });
324
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100325
Paul Sandoz82d48912016-09-01 10:16:57 -0700326
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100327 }
328
329
330 static void testInstanceField(VarHandleTestAccessByte recv, VarHandle vh) {
331 // Plain
332 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300333 vh.set(recv, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100334 byte x = (byte) vh.get(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300335 assertEquals(x, (byte)0x01, "set byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100336 }
337
338
339 // Volatile
340 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300341 vh.setVolatile(recv, (byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100342 byte x = (byte) vh.getVolatile(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300343 assertEquals(x, (byte)0x23, "setVolatile byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100344 }
345
346 // Lazy
347 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300348 vh.setRelease(recv, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100349 byte x = (byte) vh.getAcquire(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300350 assertEquals(x, (byte)0x01, "setRelease byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100351 }
352
353 // Opaque
354 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300355 vh.setOpaque(recv, (byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100356 byte x = (byte) vh.getOpaque(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300357 assertEquals(x, (byte)0x23, "setOpaque byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100358 }
359
Aleksey Shipileve6632062016-06-15 11:20:15 +0300360 vh.set(recv, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100361
Aleksey Shipileve6632062016-06-15 11:20:15 +0300362 // Compare
363 {
364 boolean r = vh.compareAndSet(recv, (byte)0x01, (byte)0x23);
365 assertEquals(r, true, "success compareAndSet byte");
366 byte x = (byte) vh.get(recv);
367 assertEquals(x, (byte)0x23, "success compareAndSet byte value");
368 }
369
370 {
371 boolean r = vh.compareAndSet(recv, (byte)0x01, (byte)0x45);
372 assertEquals(r, false, "failing compareAndSet byte");
373 byte x = (byte) vh.get(recv);
374 assertEquals(x, (byte)0x23, "failing compareAndSet byte value");
375 }
376
377 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200378 byte r = (byte) vh.compareAndExchange(recv, (byte)0x23, (byte)0x01);
379 assertEquals(r, (byte)0x23, "success compareAndExchange byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300380 byte x = (byte) vh.get(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200381 assertEquals(x, (byte)0x01, "success compareAndExchange byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300382 }
383
384 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200385 byte r = (byte) vh.compareAndExchange(recv, (byte)0x23, (byte)0x45);
386 assertEquals(r, (byte)0x01, "failing compareAndExchange byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300387 byte x = (byte) vh.get(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200388 assertEquals(x, (byte)0x01, "failing compareAndExchange byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300389 }
390
391 {
392 byte r = (byte) vh.compareAndExchangeAcquire(recv, (byte)0x01, (byte)0x23);
393 assertEquals(r, (byte)0x01, "success compareAndExchangeAcquire byte");
394 byte x = (byte) vh.get(recv);
395 assertEquals(x, (byte)0x23, "success compareAndExchangeAcquire byte value");
396 }
397
398 {
399 byte r = (byte) vh.compareAndExchangeAcquire(recv, (byte)0x01, (byte)0x45);
400 assertEquals(r, (byte)0x23, "failing compareAndExchangeAcquire byte");
401 byte x = (byte) vh.get(recv);
402 assertEquals(x, (byte)0x23, "failing compareAndExchangeAcquire byte value");
403 }
404
405 {
406 byte r = (byte) vh.compareAndExchangeRelease(recv, (byte)0x23, (byte)0x01);
407 assertEquals(r, (byte)0x23, "success compareAndExchangeRelease byte");
408 byte x = (byte) vh.get(recv);
409 assertEquals(x, (byte)0x01, "success compareAndExchangeRelease byte value");
410 }
411
412 {
413 byte r = (byte) vh.compareAndExchangeRelease(recv, (byte)0x23, (byte)0x45);
414 assertEquals(r, (byte)0x01, "failing compareAndExchangeRelease byte");
415 byte x = (byte) vh.get(recv);
416 assertEquals(x, (byte)0x01, "failing compareAndExchangeRelease byte value");
417 }
418
419 {
420 boolean success = false;
421 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700422 success = vh.weakCompareAndSetPlain(recv, (byte)0x01, (byte)0x23);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300423 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700424 assertEquals(success, true, "weakCompareAndSetPlain byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300425 byte x = (byte) vh.get(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700426 assertEquals(x, (byte)0x23, "weakCompareAndSetPlain byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300427 }
428
429 {
430 boolean success = false;
431 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
432 success = vh.weakCompareAndSetAcquire(recv, (byte)0x23, (byte)0x01);
433 }
434 assertEquals(success, true, "weakCompareAndSetAcquire byte");
435 byte x = (byte) vh.get(recv);
436 assertEquals(x, (byte)0x01, "weakCompareAndSetAcquire byte");
437 }
438
439 {
440 boolean success = false;
441 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
442 success = vh.weakCompareAndSetRelease(recv, (byte)0x01, (byte)0x23);
443 }
444 assertEquals(success, true, "weakCompareAndSetRelease byte");
445 byte x = (byte) vh.get(recv);
446 assertEquals(x, (byte)0x23, "weakCompareAndSetRelease byte");
447 }
448
449 {
450 boolean success = false;
451 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700452 success = vh.weakCompareAndSet(recv, (byte)0x23, (byte)0x01);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300453 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700454 assertEquals(success, true, "weakCompareAndSet byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300455 byte x = (byte) vh.get(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700456 assertEquals(x, (byte)0x01, "weakCompareAndSet byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300457 }
458
459 // Compare set and get
460 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700461 vh.set(recv, (byte)0x01);
462
Aleksey Shipileve6632062016-06-15 11:20:15 +0300463 byte o = (byte) vh.getAndSet(recv, (byte)0x23);
464 assertEquals(o, (byte)0x01, "getAndSet byte");
465 byte x = (byte) vh.get(recv);
466 assertEquals(x, (byte)0x23, "getAndSet byte value");
467 }
468
Paul Sandoz82d48912016-09-01 10:16:57 -0700469 {
470 vh.set(recv, (byte)0x01);
471
472 byte o = (byte) vh.getAndSetAcquire(recv, (byte)0x23);
473 assertEquals(o, (byte)0x01, "getAndSetAcquire byte");
474 byte x = (byte) vh.get(recv);
475 assertEquals(x, (byte)0x23, "getAndSetAcquire byte value");
476 }
477
478 {
479 vh.set(recv, (byte)0x01);
480
481 byte o = (byte) vh.getAndSetRelease(recv, (byte)0x23);
482 assertEquals(o, (byte)0x01, "getAndSetRelease byte");
483 byte x = (byte) vh.get(recv);
484 assertEquals(x, (byte)0x23, "getAndSetRelease byte value");
485 }
Aleksey Shipileve6632062016-06-15 11:20:15 +0300486
487 // get and add, add and get
488 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700489 vh.set(recv, (byte)0x01);
490
Paul Sandozc073edc2016-09-01 10:17:01 -0700491 byte o = (byte) vh.getAndAdd(recv, (byte)0x23);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300492 assertEquals(o, (byte)0x01, "getAndAdd byte");
Paul Sandozc073edc2016-09-01 10:17:01 -0700493 byte x = (byte) vh.get(recv);
494 assertEquals(x, (byte)((byte)0x01 + (byte)0x23), "getAndAdd byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300495 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700496
497 {
498 vh.set(recv, (byte)0x01);
499
500 byte o = (byte) vh.getAndAddAcquire(recv, (byte)0x23);
501 assertEquals(o, (byte)0x01, "getAndAddAcquire byte");
502 byte x = (byte) vh.get(recv);
503 assertEquals(x, (byte)((byte)0x01 + (byte)0x23), "getAndAddAcquire byte value");
504 }
505
506 {
507 vh.set(recv, (byte)0x01);
508
509 byte o = (byte) vh.getAndAddRelease(recv, (byte)0x23);
510 assertEquals(o, (byte)0x01, "getAndAddReleasebyte");
511 byte x = (byte) vh.get(recv);
512 assertEquals(x, (byte)((byte)0x01 + (byte)0x23), "getAndAddRelease byte value");
513 }
514
515 // get and bitwise or
516 {
517 vh.set(recv, (byte)0x01);
518
519 byte o = (byte) vh.getAndBitwiseOr(recv, (byte)0x23);
520 assertEquals(o, (byte)0x01, "getAndBitwiseOr byte");
521 byte x = (byte) vh.get(recv);
522 assertEquals(x, (byte)((byte)0x01 | (byte)0x23), "getAndBitwiseOr byte value");
523 }
524
525 {
526 vh.set(recv, (byte)0x01);
527
528 byte o = (byte) vh.getAndBitwiseOrAcquire(recv, (byte)0x23);
529 assertEquals(o, (byte)0x01, "getAndBitwiseOrAcquire byte");
530 byte x = (byte) vh.get(recv);
531 assertEquals(x, (byte)((byte)0x01 | (byte)0x23), "getAndBitwiseOrAcquire byte value");
532 }
533
534 {
535 vh.set(recv, (byte)0x01);
536
537 byte o = (byte) vh.getAndBitwiseOrRelease(recv, (byte)0x23);
538 assertEquals(o, (byte)0x01, "getAndBitwiseOrRelease byte");
539 byte x = (byte) vh.get(recv);
540 assertEquals(x, (byte)((byte)0x01 | (byte)0x23), "getAndBitwiseOrRelease byte value");
541 }
542
543 // get and bitwise and
544 {
545 vh.set(recv, (byte)0x01);
546
547 byte o = (byte) vh.getAndBitwiseAnd(recv, (byte)0x23);
548 assertEquals(o, (byte)0x01, "getAndBitwiseAnd byte");
549 byte x = (byte) vh.get(recv);
550 assertEquals(x, (byte)((byte)0x01 & (byte)0x23), "getAndBitwiseAnd byte value");
551 }
552
553 {
554 vh.set(recv, (byte)0x01);
555
556 byte o = (byte) vh.getAndBitwiseAndAcquire(recv, (byte)0x23);
557 assertEquals(o, (byte)0x01, "getAndBitwiseAndAcquire byte");
558 byte x = (byte) vh.get(recv);
559 assertEquals(x, (byte)((byte)0x01 & (byte)0x23), "getAndBitwiseAndAcquire byte value");
560 }
561
562 {
563 vh.set(recv, (byte)0x01);
564
565 byte o = (byte) vh.getAndBitwiseAndRelease(recv, (byte)0x23);
566 assertEquals(o, (byte)0x01, "getAndBitwiseAndRelease byte");
567 byte x = (byte) vh.get(recv);
568 assertEquals(x, (byte)((byte)0x01 & (byte)0x23), "getAndBitwiseAndRelease byte value");
569 }
570
571 // get and bitwise xor
572 {
573 vh.set(recv, (byte)0x01);
574
575 byte o = (byte) vh.getAndBitwiseXor(recv, (byte)0x23);
576 assertEquals(o, (byte)0x01, "getAndBitwiseXor byte");
577 byte x = (byte) vh.get(recv);
578 assertEquals(x, (byte)((byte)0x01 ^ (byte)0x23), "getAndBitwiseXor byte value");
579 }
580
581 {
582 vh.set(recv, (byte)0x01);
583
584 byte o = (byte) vh.getAndBitwiseXorAcquire(recv, (byte)0x23);
585 assertEquals(o, (byte)0x01, "getAndBitwiseXorAcquire byte");
586 byte x = (byte) vh.get(recv);
587 assertEquals(x, (byte)((byte)0x01 ^ (byte)0x23), "getAndBitwiseXorAcquire byte value");
588 }
589
590 {
591 vh.set(recv, (byte)0x01);
592
593 byte o = (byte) vh.getAndBitwiseXorRelease(recv, (byte)0x23);
594 assertEquals(o, (byte)0x01, "getAndBitwiseXorRelease byte");
595 byte x = (byte) vh.get(recv);
596 assertEquals(x, (byte)((byte)0x01 ^ (byte)0x23), "getAndBitwiseXorRelease byte value");
597 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100598 }
599
600 static void testInstanceFieldUnsupported(VarHandleTestAccessByte recv, VarHandle vh) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100601
Paul Sandoz82d48912016-09-01 10:16:57 -0700602
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100603 }
604
605
606 static void testStaticField(VarHandle vh) {
607 // Plain
608 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300609 vh.set((byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100610 byte x = (byte) vh.get();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300611 assertEquals(x, (byte)0x01, "set byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100612 }
613
614
615 // Volatile
616 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300617 vh.setVolatile((byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100618 byte x = (byte) vh.getVolatile();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300619 assertEquals(x, (byte)0x23, "setVolatile byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100620 }
621
622 // Lazy
623 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300624 vh.setRelease((byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100625 byte x = (byte) vh.getAcquire();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300626 assertEquals(x, (byte)0x01, "setRelease byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100627 }
628
629 // Opaque
630 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300631 vh.setOpaque((byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100632 byte x = (byte) vh.getOpaque();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300633 assertEquals(x, (byte)0x23, "setOpaque byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100634 }
635
Aleksey Shipileve6632062016-06-15 11:20:15 +0300636 vh.set((byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100637
Aleksey Shipileve6632062016-06-15 11:20:15 +0300638 // Compare
639 {
640 boolean r = vh.compareAndSet((byte)0x01, (byte)0x23);
641 assertEquals(r, true, "success compareAndSet byte");
642 byte x = (byte) vh.get();
643 assertEquals(x, (byte)0x23, "success compareAndSet byte value");
644 }
645
646 {
647 boolean r = vh.compareAndSet((byte)0x01, (byte)0x45);
648 assertEquals(r, false, "failing compareAndSet byte");
649 byte x = (byte) vh.get();
650 assertEquals(x, (byte)0x23, "failing compareAndSet byte value");
651 }
652
653 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200654 byte r = (byte) vh.compareAndExchange((byte)0x23, (byte)0x01);
655 assertEquals(r, (byte)0x23, "success compareAndExchange byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300656 byte x = (byte) vh.get();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200657 assertEquals(x, (byte)0x01, "success compareAndExchange byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300658 }
659
660 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200661 byte r = (byte) vh.compareAndExchange((byte)0x23, (byte)0x45);
662 assertEquals(r, (byte)0x01, "failing compareAndExchange byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300663 byte x = (byte) vh.get();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200664 assertEquals(x, (byte)0x01, "failing compareAndExchange byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300665 }
666
667 {
668 byte r = (byte) vh.compareAndExchangeAcquire((byte)0x01, (byte)0x23);
669 assertEquals(r, (byte)0x01, "success compareAndExchangeAcquire byte");
670 byte x = (byte) vh.get();
671 assertEquals(x, (byte)0x23, "success compareAndExchangeAcquire byte value");
672 }
673
674 {
675 byte r = (byte) vh.compareAndExchangeAcquire((byte)0x01, (byte)0x45);
676 assertEquals(r, (byte)0x23, "failing compareAndExchangeAcquire byte");
677 byte x = (byte) vh.get();
678 assertEquals(x, (byte)0x23, "failing compareAndExchangeAcquire byte value");
679 }
680
681 {
682 byte r = (byte) vh.compareAndExchangeRelease((byte)0x23, (byte)0x01);
683 assertEquals(r, (byte)0x23, "success compareAndExchangeRelease byte");
684 byte x = (byte) vh.get();
685 assertEquals(x, (byte)0x01, "success compareAndExchangeRelease byte value");
686 }
687
688 {
689 byte r = (byte) vh.compareAndExchangeRelease((byte)0x23, (byte)0x45);
690 assertEquals(r, (byte)0x01, "failing compareAndExchangeRelease byte");
691 byte x = (byte) vh.get();
692 assertEquals(x, (byte)0x01, "failing compareAndExchangeRelease byte value");
693 }
694
695 {
696 boolean success = false;
697 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700698 success = vh.weakCompareAndSetPlain((byte)0x01, (byte)0x23);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300699 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700700 assertEquals(success, true, "weakCompareAndSetPlain byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300701 byte x = (byte) vh.get();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700702 assertEquals(x, (byte)0x23, "weakCompareAndSetPlain byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300703 }
704
705 {
706 boolean success = false;
707 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
708 success = vh.weakCompareAndSetAcquire((byte)0x23, (byte)0x01);
709 }
710 assertEquals(success, true, "weakCompareAndSetAcquire byte");
711 byte x = (byte) vh.get();
712 assertEquals(x, (byte)0x01, "weakCompareAndSetAcquire byte");
713 }
714
715 {
716 boolean success = false;
717 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
718 success = vh.weakCompareAndSetRelease((byte)0x01, (byte)0x23);
719 }
720 assertEquals(success, true, "weakCompareAndSetRelease byte");
721 byte x = (byte) vh.get();
722 assertEquals(x, (byte)0x23, "weakCompareAndSetRelease byte");
723 }
724
725 {
726 boolean success = false;
727 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700728 success = vh.weakCompareAndSet((byte)0x23, (byte)0x01);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300729 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700730 assertEquals(success, true, "weakCompareAndSet byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300731 byte x = (byte) vh.get();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700732 assertEquals(x, (byte)0x01, "weakCompareAndSet byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300733 }
734
735 // Compare set and get
736 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700737 vh.set((byte)0x01);
738
Aleksey Shipileve6632062016-06-15 11:20:15 +0300739 byte o = (byte) vh.getAndSet((byte)0x23);
740 assertEquals(o, (byte)0x01, "getAndSet byte");
741 byte x = (byte) vh.get();
742 assertEquals(x, (byte)0x23, "getAndSet byte value");
743 }
744
Paul Sandoz82d48912016-09-01 10:16:57 -0700745 {
746 vh.set((byte)0x01);
747
748 byte o = (byte) vh.getAndSetAcquire((byte)0x23);
749 assertEquals(o, (byte)0x01, "getAndSetAcquire byte");
750 byte x = (byte) vh.get();
751 assertEquals(x, (byte)0x23, "getAndSetAcquire byte value");
752 }
753
754 {
755 vh.set((byte)0x01);
756
757 byte o = (byte) vh.getAndSetRelease((byte)0x23);
758 assertEquals(o, (byte)0x01, "getAndSetRelease byte");
759 byte x = (byte) vh.get();
760 assertEquals(x, (byte)0x23, "getAndSetRelease byte value");
761 }
Aleksey Shipileve6632062016-06-15 11:20:15 +0300762
763 // get and add, add and get
764 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700765 vh.set((byte)0x01);
766
Paul Sandozc073edc2016-09-01 10:17:01 -0700767 byte o = (byte) vh.getAndAdd((byte)0x23);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300768 assertEquals(o, (byte)0x01, "getAndAdd byte");
Paul Sandozc073edc2016-09-01 10:17:01 -0700769 byte x = (byte) vh.get();
770 assertEquals(x, (byte)((byte)0x01 + (byte)0x23), "getAndAdd byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300771 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700772
773 {
774 vh.set((byte)0x01);
775
776 byte o = (byte) vh.getAndAddAcquire((byte)0x23);
777 assertEquals(o, (byte)0x01, "getAndAddAcquire byte");
778 byte x = (byte) vh.get();
779 assertEquals(x, (byte)((byte)0x01 + (byte)0x23), "getAndAddAcquire byte value");
780 }
781
782 {
783 vh.set((byte)0x01);
784
785 byte o = (byte) vh.getAndAddRelease((byte)0x23);
786 assertEquals(o, (byte)0x01, "getAndAddReleasebyte");
787 byte x = (byte) vh.get();
788 assertEquals(x, (byte)((byte)0x01 + (byte)0x23), "getAndAddRelease byte value");
789 }
790
791 // get and bitwise or
792 {
793 vh.set((byte)0x01);
794
795 byte o = (byte) vh.getAndBitwiseOr((byte)0x23);
796 assertEquals(o, (byte)0x01, "getAndBitwiseOr byte");
797 byte x = (byte) vh.get();
798 assertEquals(x, (byte)((byte)0x01 | (byte)0x23), "getAndBitwiseOr byte value");
799 }
800
801 {
802 vh.set((byte)0x01);
803
804 byte o = (byte) vh.getAndBitwiseOrAcquire((byte)0x23);
805 assertEquals(o, (byte)0x01, "getAndBitwiseOrAcquire byte");
806 byte x = (byte) vh.get();
807 assertEquals(x, (byte)((byte)0x01 | (byte)0x23), "getAndBitwiseOrAcquire byte value");
808 }
809
810 {
811 vh.set((byte)0x01);
812
813 byte o = (byte) vh.getAndBitwiseOrRelease((byte)0x23);
814 assertEquals(o, (byte)0x01, "getAndBitwiseOrRelease byte");
815 byte x = (byte) vh.get();
816 assertEquals(x, (byte)((byte)0x01 | (byte)0x23), "getAndBitwiseOrRelease byte value");
817 }
818
819 // get and bitwise and
820 {
821 vh.set((byte)0x01);
822
823 byte o = (byte) vh.getAndBitwiseAnd((byte)0x23);
824 assertEquals(o, (byte)0x01, "getAndBitwiseAnd byte");
825 byte x = (byte) vh.get();
826 assertEquals(x, (byte)((byte)0x01 & (byte)0x23), "getAndBitwiseAnd byte value");
827 }
828
829 {
830 vh.set((byte)0x01);
831
832 byte o = (byte) vh.getAndBitwiseAndAcquire((byte)0x23);
833 assertEquals(o, (byte)0x01, "getAndBitwiseAndAcquire byte");
834 byte x = (byte) vh.get();
835 assertEquals(x, (byte)((byte)0x01 & (byte)0x23), "getAndBitwiseAndAcquire byte value");
836 }
837
838 {
839 vh.set((byte)0x01);
840
841 byte o = (byte) vh.getAndBitwiseAndRelease((byte)0x23);
842 assertEquals(o, (byte)0x01, "getAndBitwiseAndRelease byte");
843 byte x = (byte) vh.get();
844 assertEquals(x, (byte)((byte)0x01 & (byte)0x23), "getAndBitwiseAndRelease byte value");
845 }
846
847 // get and bitwise xor
848 {
849 vh.set((byte)0x01);
850
851 byte o = (byte) vh.getAndBitwiseXor((byte)0x23);
852 assertEquals(o, (byte)0x01, "getAndBitwiseXor byte");
853 byte x = (byte) vh.get();
854 assertEquals(x, (byte)((byte)0x01 ^ (byte)0x23), "getAndBitwiseXor byte value");
855 }
856
857 {
858 vh.set((byte)0x01);
859
860 byte o = (byte) vh.getAndBitwiseXorAcquire((byte)0x23);
861 assertEquals(o, (byte)0x01, "getAndBitwiseXorAcquire byte");
862 byte x = (byte) vh.get();
863 assertEquals(x, (byte)((byte)0x01 ^ (byte)0x23), "getAndBitwiseXorAcquire byte value");
864 }
865
866 {
867 vh.set((byte)0x01);
868
869 byte o = (byte) vh.getAndBitwiseXorRelease((byte)0x23);
870 assertEquals(o, (byte)0x01, "getAndBitwiseXorRelease byte");
871 byte x = (byte) vh.get();
872 assertEquals(x, (byte)((byte)0x01 ^ (byte)0x23), "getAndBitwiseXorRelease byte value");
873 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100874 }
875
876 static void testStaticFieldUnsupported(VarHandle vh) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100877
Paul Sandoz82d48912016-09-01 10:16:57 -0700878
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100879 }
880
881
882 static void testArray(VarHandle vh) {
883 byte[] array = new byte[10];
884
885 for (int i = 0; i < array.length; i++) {
886 // Plain
887 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300888 vh.set(array, i, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100889 byte x = (byte) vh.get(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300890 assertEquals(x, (byte)0x01, "get byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100891 }
892
893
894 // Volatile
895 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300896 vh.setVolatile(array, i, (byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100897 byte x = (byte) vh.getVolatile(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300898 assertEquals(x, (byte)0x23, "setVolatile byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100899 }
900
901 // Lazy
902 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300903 vh.setRelease(array, i, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100904 byte x = (byte) vh.getAcquire(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300905 assertEquals(x, (byte)0x01, "setRelease byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100906 }
907
908 // Opaque
909 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300910 vh.setOpaque(array, i, (byte)0x23);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100911 byte x = (byte) vh.getOpaque(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300912 assertEquals(x, (byte)0x23, "setOpaque byte value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100913 }
914
Aleksey Shipileve6632062016-06-15 11:20:15 +0300915 vh.set(array, i, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100916
Aleksey Shipileve6632062016-06-15 11:20:15 +0300917 // Compare
918 {
919 boolean r = vh.compareAndSet(array, i, (byte)0x01, (byte)0x23);
920 assertEquals(r, true, "success compareAndSet byte");
921 byte x = (byte) vh.get(array, i);
922 assertEquals(x, (byte)0x23, "success compareAndSet byte value");
923 }
924
925 {
926 boolean r = vh.compareAndSet(array, i, (byte)0x01, (byte)0x45);
927 assertEquals(r, false, "failing compareAndSet byte");
928 byte x = (byte) vh.get(array, i);
929 assertEquals(x, (byte)0x23, "failing compareAndSet byte value");
930 }
931
932 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200933 byte r = (byte) vh.compareAndExchange(array, i, (byte)0x23, (byte)0x01);
934 assertEquals(r, (byte)0x23, "success compareAndExchange byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300935 byte x = (byte) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200936 assertEquals(x, (byte)0x01, "success compareAndExchange byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300937 }
938
939 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200940 byte r = (byte) vh.compareAndExchange(array, i, (byte)0x23, (byte)0x45);
941 assertEquals(r, (byte)0x01, "failing compareAndExchange byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300942 byte x = (byte) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200943 assertEquals(x, (byte)0x01, "failing compareAndExchange byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300944 }
945
946 {
947 byte r = (byte) vh.compareAndExchangeAcquire(array, i, (byte)0x01, (byte)0x23);
948 assertEquals(r, (byte)0x01, "success compareAndExchangeAcquire byte");
949 byte x = (byte) vh.get(array, i);
950 assertEquals(x, (byte)0x23, "success compareAndExchangeAcquire byte value");
951 }
952
953 {
954 byte r = (byte) vh.compareAndExchangeAcquire(array, i, (byte)0x01, (byte)0x45);
955 assertEquals(r, (byte)0x23, "failing compareAndExchangeAcquire byte");
956 byte x = (byte) vh.get(array, i);
957 assertEquals(x, (byte)0x23, "failing compareAndExchangeAcquire byte value");
958 }
959
960 {
961 byte r = (byte) vh.compareAndExchangeRelease(array, i, (byte)0x23, (byte)0x01);
962 assertEquals(r, (byte)0x23, "success compareAndExchangeRelease byte");
963 byte x = (byte) vh.get(array, i);
964 assertEquals(x, (byte)0x01, "success compareAndExchangeRelease byte value");
965 }
966
967 {
968 byte r = (byte) vh.compareAndExchangeRelease(array, i, (byte)0x23, (byte)0x45);
969 assertEquals(r, (byte)0x01, "failing compareAndExchangeRelease byte");
970 byte x = (byte) vh.get(array, i);
971 assertEquals(x, (byte)0x01, "failing compareAndExchangeRelease byte value");
972 }
973
974 {
975 boolean success = false;
976 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700977 success = vh.weakCompareAndSetPlain(array, i, (byte)0x01, (byte)0x23);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300978 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700979 assertEquals(success, true, "weakCompareAndSetPlain byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300980 byte x = (byte) vh.get(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700981 assertEquals(x, (byte)0x23, "weakCompareAndSetPlain byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300982 }
983
984 {
985 boolean success = false;
986 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
987 success = vh.weakCompareAndSetAcquire(array, i, (byte)0x23, (byte)0x01);
988 }
989 assertEquals(success, true, "weakCompareAndSetAcquire byte");
990 byte x = (byte) vh.get(array, i);
991 assertEquals(x, (byte)0x01, "weakCompareAndSetAcquire byte");
992 }
993
994 {
995 boolean success = false;
996 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
997 success = vh.weakCompareAndSetRelease(array, i, (byte)0x01, (byte)0x23);
998 }
999 assertEquals(success, true, "weakCompareAndSetRelease byte");
1000 byte x = (byte) vh.get(array, i);
1001 assertEquals(x, (byte)0x23, "weakCompareAndSetRelease byte");
1002 }
1003
1004 {
1005 boolean success = false;
1006 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -07001007 success = vh.weakCompareAndSet(array, i, (byte)0x23, (byte)0x01);
Aleksey Shipileve6632062016-06-15 11:20:15 +03001008 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -07001009 assertEquals(success, true, "weakCompareAndSet byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +03001010 byte x = (byte) vh.get(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -07001011 assertEquals(x, (byte)0x01, "weakCompareAndSet byte");
Aleksey Shipileve6632062016-06-15 11:20:15 +03001012 }
1013
1014 // Compare set and get
1015 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001016 vh.set(array, i, (byte)0x01);
1017
Aleksey Shipileve6632062016-06-15 11:20:15 +03001018 byte o = (byte) vh.getAndSet(array, i, (byte)0x23);
1019 assertEquals(o, (byte)0x01, "getAndSet byte");
1020 byte x = (byte) vh.get(array, i);
1021 assertEquals(x, (byte)0x23, "getAndSet byte value");
1022 }
1023
Paul Sandoz82d48912016-09-01 10:16:57 -07001024 {
1025 vh.set(array, i, (byte)0x01);
1026
1027 byte o = (byte) vh.getAndSetAcquire(array, i, (byte)0x23);
1028 assertEquals(o, (byte)0x01, "getAndSetAcquire byte");
1029 byte x = (byte) vh.get(array, i);
1030 assertEquals(x, (byte)0x23, "getAndSetAcquire byte value");
1031 }
1032
1033 {
1034 vh.set(array, i, (byte)0x01);
1035
1036 byte o = (byte) vh.getAndSetRelease(array, i, (byte)0x23);
1037 assertEquals(o, (byte)0x01, "getAndSetRelease byte");
1038 byte x = (byte) vh.get(array, i);
1039 assertEquals(x, (byte)0x23, "getAndSetRelease byte value");
1040 }
Aleksey Shipileve6632062016-06-15 11:20:15 +03001041
1042 // get and add, add and get
1043 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001044 vh.set(array, i, (byte)0x01);
1045
Paul Sandozc073edc2016-09-01 10:17:01 -07001046 byte o = (byte) vh.getAndAdd(array, i, (byte)0x23);
Aleksey Shipileve6632062016-06-15 11:20:15 +03001047 assertEquals(o, (byte)0x01, "getAndAdd byte");
Paul Sandozc073edc2016-09-01 10:17:01 -07001048 byte x = (byte) vh.get(array, i);
1049 assertEquals(x, (byte)((byte)0x01 + (byte)0x23), "getAndAdd byte value");
Aleksey Shipileve6632062016-06-15 11:20:15 +03001050 }
Paul Sandoz82d48912016-09-01 10:16:57 -07001051
1052 {
1053 vh.set(array, i, (byte)0x01);
1054
1055 byte o = (byte) vh.getAndAddAcquire(array, i, (byte)0x23);
1056 assertEquals(o, (byte)0x01, "getAndAddAcquire byte");
1057 byte x = (byte) vh.get(array, i);
1058 assertEquals(x, (byte)((byte)0x01 + (byte)0x23), "getAndAddAcquire byte value");
1059 }
1060
1061 {
1062 vh.set(array, i, (byte)0x01);
1063
1064 byte o = (byte) vh.getAndAddRelease(array, i, (byte)0x23);
1065 assertEquals(o, (byte)0x01, "getAndAddReleasebyte");
1066 byte x = (byte) vh.get(array, i);
1067 assertEquals(x, (byte)((byte)0x01 + (byte)0x23), "getAndAddRelease byte value");
1068 }
1069
1070 // get and bitwise or
1071 {
1072 vh.set(array, i, (byte)0x01);
1073
1074 byte o = (byte) vh.getAndBitwiseOr(array, i, (byte)0x23);
1075 assertEquals(o, (byte)0x01, "getAndBitwiseOr byte");
1076 byte x = (byte) vh.get(array, i);
1077 assertEquals(x, (byte)((byte)0x01 | (byte)0x23), "getAndBitwiseOr byte value");
1078 }
1079
1080 {
1081 vh.set(array, i, (byte)0x01);
1082
1083 byte o = (byte) vh.getAndBitwiseOrAcquire(array, i, (byte)0x23);
1084 assertEquals(o, (byte)0x01, "getAndBitwiseOrAcquire byte");
1085 byte x = (byte) vh.get(array, i);
1086 assertEquals(x, (byte)((byte)0x01 | (byte)0x23), "getAndBitwiseOrAcquire byte value");
1087 }
1088
1089 {
1090 vh.set(array, i, (byte)0x01);
1091
1092 byte o = (byte) vh.getAndBitwiseOrRelease(array, i, (byte)0x23);
1093 assertEquals(o, (byte)0x01, "getAndBitwiseOrRelease byte");
1094 byte x = (byte) vh.get(array, i);
1095 assertEquals(x, (byte)((byte)0x01 | (byte)0x23), "getAndBitwiseOrRelease byte value");
1096 }
1097
1098 // get and bitwise and
1099 {
1100 vh.set(array, i, (byte)0x01);
1101
1102 byte o = (byte) vh.getAndBitwiseAnd(array, i, (byte)0x23);
1103 assertEquals(o, (byte)0x01, "getAndBitwiseAnd byte");
1104 byte x = (byte) vh.get(array, i);
1105 assertEquals(x, (byte)((byte)0x01 & (byte)0x23), "getAndBitwiseAnd byte value");
1106 }
1107
1108 {
1109 vh.set(array, i, (byte)0x01);
1110
1111 byte o = (byte) vh.getAndBitwiseAndAcquire(array, i, (byte)0x23);
1112 assertEquals(o, (byte)0x01, "getAndBitwiseAndAcquire byte");
1113 byte x = (byte) vh.get(array, i);
1114 assertEquals(x, (byte)((byte)0x01 & (byte)0x23), "getAndBitwiseAndAcquire byte value");
1115 }
1116
1117 {
1118 vh.set(array, i, (byte)0x01);
1119
1120 byte o = (byte) vh.getAndBitwiseAndRelease(array, i, (byte)0x23);
1121 assertEquals(o, (byte)0x01, "getAndBitwiseAndRelease byte");
1122 byte x = (byte) vh.get(array, i);
1123 assertEquals(x, (byte)((byte)0x01 & (byte)0x23), "getAndBitwiseAndRelease byte value");
1124 }
1125
1126 // get and bitwise xor
1127 {
1128 vh.set(array, i, (byte)0x01);
1129
1130 byte o = (byte) vh.getAndBitwiseXor(array, i, (byte)0x23);
1131 assertEquals(o, (byte)0x01, "getAndBitwiseXor byte");
1132 byte x = (byte) vh.get(array, i);
1133 assertEquals(x, (byte)((byte)0x01 ^ (byte)0x23), "getAndBitwiseXor byte value");
1134 }
1135
1136 {
1137 vh.set(array, i, (byte)0x01);
1138
1139 byte o = (byte) vh.getAndBitwiseXorAcquire(array, i, (byte)0x23);
1140 assertEquals(o, (byte)0x01, "getAndBitwiseXorAcquire byte");
1141 byte x = (byte) vh.get(array, i);
1142 assertEquals(x, (byte)((byte)0x01 ^ (byte)0x23), "getAndBitwiseXorAcquire byte value");
1143 }
1144
1145 {
1146 vh.set(array, i, (byte)0x01);
1147
1148 byte o = (byte) vh.getAndBitwiseXorRelease(array, i, (byte)0x23);
1149 assertEquals(o, (byte)0x01, "getAndBitwiseXorRelease byte");
1150 byte x = (byte) vh.get(array, i);
1151 assertEquals(x, (byte)((byte)0x01 ^ (byte)0x23), "getAndBitwiseXorRelease byte value");
1152 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001153 }
1154 }
1155
1156 static void testArrayUnsupported(VarHandle vh) {
1157 byte[] array = new byte[10];
1158
1159 int i = 0;
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001160
Paul Sandoz82d48912016-09-01 10:16:57 -07001161
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001162 }
1163
1164 static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable {
1165 byte[] array = new byte[10];
1166
1167 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
1168 final int ci = i;
1169
1170 checkIOOBE(() -> {
1171 byte x = (byte) vh.get(array, ci);
1172 });
1173
1174 checkIOOBE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +03001175 vh.set(array, ci, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001176 });
1177
1178 checkIOOBE(() -> {
1179 byte x = (byte) vh.getVolatile(array, ci);
1180 });
1181
1182 checkIOOBE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +03001183 vh.setVolatile(array, ci, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001184 });
1185
1186 checkIOOBE(() -> {
1187 byte x = (byte) vh.getAcquire(array, ci);
1188 });
1189
1190 checkIOOBE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +03001191 vh.setRelease(array, ci, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001192 });
1193
1194 checkIOOBE(() -> {
1195 byte x = (byte) vh.getOpaque(array, ci);
1196 });
1197
1198 checkIOOBE(() -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +03001199 vh.setOpaque(array, ci, (byte)0x01);
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001200 });
1201
Aleksey Shipileve6632062016-06-15 11:20:15 +03001202 checkIOOBE(() -> {
1203 boolean r = vh.compareAndSet(array, ci, (byte)0x01, (byte)0x23);
1204 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001205
Aleksey Shipileve6632062016-06-15 11:20:15 +03001206 checkIOOBE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001207 byte r = (byte) vh.compareAndExchange(array, ci, (byte)0x23, (byte)0x01);
Aleksey Shipileve6632062016-06-15 11:20:15 +03001208 });
1209
1210 checkIOOBE(() -> {
1211 byte r = (byte) vh.compareAndExchangeAcquire(array, ci, (byte)0x23, (byte)0x01);
1212 });
1213
1214 checkIOOBE(() -> {
1215 byte r = (byte) vh.compareAndExchangeRelease(array, ci, (byte)0x23, (byte)0x01);
1216 });
1217
1218 checkIOOBE(() -> {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -07001219 boolean r = vh.weakCompareAndSetPlain(array, ci, (byte)0x01, (byte)0x23);
Aleksey Shipileve6632062016-06-15 11:20:15 +03001220 });
1221
1222 checkIOOBE(() -> {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -07001223 boolean r = vh.weakCompareAndSet(array, ci, (byte)0x01, (byte)0x23);
Aleksey Shipileve6632062016-06-15 11:20:15 +03001224 });
1225
1226 checkIOOBE(() -> {
1227 boolean r = vh.weakCompareAndSetAcquire(array, ci, (byte)0x01, (byte)0x23);
1228 });
1229
1230 checkIOOBE(() -> {
1231 boolean r = vh.weakCompareAndSetRelease(array, ci, (byte)0x01, (byte)0x23);
1232 });
1233
1234 checkIOOBE(() -> {
1235 byte o = (byte) vh.getAndSet(array, ci, (byte)0x01);
1236 });
1237
1238 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -07001239 byte o = (byte) vh.getAndSetAcquire(array, ci, (byte)0x01);
Aleksey Shipileve6632062016-06-15 11:20:15 +03001240 });
1241
1242 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -07001243 byte o = (byte) vh.getAndSetRelease(array, ci, (byte)0x01);
1244 });
1245
1246 checkIOOBE(() -> {
1247 byte o = (byte) vh.getAndAdd(array, ci, (byte)0x01);
1248 });
1249
1250 checkIOOBE(() -> {
1251 byte o = (byte) vh.getAndAddAcquire(array, ci, (byte)0x01);
1252 });
1253
1254 checkIOOBE(() -> {
1255 byte o = (byte) vh.getAndAddRelease(array, ci, (byte)0x01);
1256 });
1257
1258 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -07001259 byte o = (byte) vh.getAndBitwiseOr(array, ci, (byte)0x01);
1260 });
1261
1262 checkIOOBE(() -> {
1263 byte o = (byte) vh.getAndBitwiseOrAcquire(array, ci, (byte)0x01);
1264 });
1265
1266 checkIOOBE(() -> {
1267 byte o = (byte) vh.getAndBitwiseOrRelease(array, ci, (byte)0x01);
1268 });
1269
1270 checkIOOBE(() -> {
1271 byte o = (byte) vh.getAndBitwiseAnd(array, ci, (byte)0x01);
1272 });
1273
1274 checkIOOBE(() -> {
1275 byte o = (byte) vh.getAndBitwiseAndAcquire(array, ci, (byte)0x01);
1276 });
1277
1278 checkIOOBE(() -> {
1279 byte o = (byte) vh.getAndBitwiseAndRelease(array, ci, (byte)0x01);
1280 });
1281
1282 checkIOOBE(() -> {
1283 byte o = (byte) vh.getAndBitwiseXor(array, ci, (byte)0x01);
1284 });
1285
1286 checkIOOBE(() -> {
1287 byte o = (byte) vh.getAndBitwiseXorAcquire(array, ci, (byte)0x01);
1288 });
1289
1290 checkIOOBE(() -> {
1291 byte o = (byte) vh.getAndBitwiseXorRelease(array, ci, (byte)0x01);
Aleksey Shipileve6632062016-06-15 11:20:15 +03001292 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001293 }
1294 }
1295}
1296