1.1 --- a/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/AtomicTest.java Wed Nov 19 19:32:00 2014 +0100
1.2 +++ b/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/AtomicTest.java Mon Feb 09 20:36:12 2015 +0100
1.3 @@ -19,7 +19,10 @@
1.4
1.5 import java.util.concurrent.atomic.AtomicBoolean;
1.6 import java.util.concurrent.atomic.AtomicInteger;
1.7 +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
1.8 +import java.util.concurrent.atomic.AtomicLongFieldUpdater;
1.9 import java.util.concurrent.atomic.AtomicReference;
1.10 +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
1.11 import org.apidesign.bck2brwsr.vmtest.Compare;
1.12 import org.apidesign.bck2brwsr.vmtest.VMTest;
1.13 import org.testng.annotations.Factory;
1.14 @@ -29,6 +32,31 @@
1.15 * @author Jaroslav Tulach <jtulach@netbeans.org>
1.16 */
1.17 public class AtomicTest {
1.18 + private volatile int intValue;
1.19 + private static AtomicIntegerFieldUpdater<AtomicTest> intUpdater;
1.20 + static AtomicIntegerFieldUpdater<AtomicTest> getIntUpdater() {
1.21 + if (intUpdater == null) {
1.22 + intUpdater = AtomicIntegerFieldUpdater.newUpdater(AtomicTest.class, "intValue");
1.23 + }
1.24 + return intUpdater;
1.25 + }
1.26 + private volatile long longValue;
1.27 + private static AtomicLongFieldUpdater<AtomicTest> longUpdater;
1.28 + static AtomicLongFieldUpdater<AtomicTest> getLongUpdater() {
1.29 + if (longUpdater == null) {
1.30 + longUpdater = AtomicLongFieldUpdater.newUpdater(AtomicTest.class, "longValue");
1.31 + }
1.32 + return longUpdater;
1.33 + }
1.34 + private volatile Number refValue;
1.35 + private static AtomicReferenceFieldUpdater<AtomicTest,Number> refUpdater;
1.36 + static AtomicReferenceFieldUpdater<AtomicTest,Number> getRefUpdater() {
1.37 + if (refUpdater == null) {
1.38 + refUpdater = AtomicReferenceFieldUpdater.newUpdater(AtomicTest.class, Number.class, "refValue");
1.39 + }
1.40 + return refUpdater;
1.41 + }
1.42 +
1.43 @Compare public boolean atomicBoolean() {
1.44 AtomicBoolean ab = new AtomicBoolean();
1.45 ab.set(true);
1.46 @@ -48,6 +76,32 @@
1.47 return ar.getAndSet("Other");
1.48 }
1.49
1.50 + @Compare public int intUpdater() {
1.51 + intValue = Integer.MAX_VALUE / 2;
1.52 + final AtomicIntegerFieldUpdater<AtomicTest> u = getIntUpdater();
1.53 + u.compareAndSet(this, 0, 10);
1.54 + u.addAndGet(this, 3);
1.55 + int thirteen = u.getAndAdd(this, 7);
1.56 + return thirteen + u.get(this);
1.57 + }
1.58 +
1.59 + @Compare public long longUpdater() {
1.60 + longValue = Long.MAX_VALUE / 2;
1.61 + final AtomicLongFieldUpdater<AtomicTest> u = getLongUpdater();
1.62 + u.compareAndSet(this, 0, 10);
1.63 + u.addAndGet(this, 3);
1.64 + long thirteen = u.getAndAdd(this, 7);
1.65 + return thirteen + u.get(this);
1.66 + }
1.67 +
1.68 + @Compare public int refUpdater() {
1.69 + final AtomicReferenceFieldUpdater<AtomicTest,Number> u = getRefUpdater();
1.70 + u.set(this, 0);
1.71 + u.compareAndSet(this, 0, 10);
1.72 + Number ten = u.getAndSet(this, 3);
1.73 + return u.get(this).intValue() + ten.intValue();
1.74 + }
1.75 +
1.76 @Factory public static Object[] create() {
1.77 return VMTest.create(AtomicTest.class);
1.78 }