jaroslav@1338: /** jaroslav@1338: * Back 2 Browser Bytecode Translator jaroslav@1787: * Copyright (C) 2012-2015 Jaroslav Tulach jaroslav@1338: * jaroslav@1338: * This program is free software: you can redistribute it and/or modify jaroslav@1338: * it under the terms of the GNU General Public License as published by jaroslav@1338: * the Free Software Foundation, version 2 of the License. jaroslav@1338: * jaroslav@1338: * This program is distributed in the hope that it will be useful, jaroslav@1338: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1338: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1338: * GNU General Public License for more details. jaroslav@1338: * jaroslav@1338: * You should have received a copy of the GNU General Public License jaroslav@1338: * along with this program. Look for COPYING file in the top folder. jaroslav@1338: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1338: */ jaroslav@1338: package org.apidesign.bck2brwsr.tck; jaroslav@1338: jaroslav@1338: import java.util.concurrent.atomic.AtomicBoolean; jaroslav@1338: import java.util.concurrent.atomic.AtomicInteger; jaroslav@1779: import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; jaroslav@1779: import java.util.concurrent.atomic.AtomicLongFieldUpdater; jaroslav@1338: import java.util.concurrent.atomic.AtomicReference; jaroslav@1779: import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; jaroslav@1338: import org.apidesign.bck2brwsr.vmtest.Compare; jaroslav@1338: import org.apidesign.bck2brwsr.vmtest.VMTest; jaroslav@1338: import org.testng.annotations.Factory; jaroslav@1338: jaroslav@1338: /** jaroslav@1338: * jaroslav@1338: * @author Jaroslav Tulach jaroslav@1338: */ jaroslav@1338: public class AtomicTest { jaroslav@1779: private volatile int intValue; jaroslav@1779: private static AtomicIntegerFieldUpdater intUpdater; jaroslav@1779: static AtomicIntegerFieldUpdater getIntUpdater() { jaroslav@1779: if (intUpdater == null) { jaroslav@1779: intUpdater = AtomicIntegerFieldUpdater.newUpdater(AtomicTest.class, "intValue"); jaroslav@1779: } jaroslav@1779: return intUpdater; jaroslav@1779: } jaroslav@1779: private volatile long longValue; jaroslav@1779: private static AtomicLongFieldUpdater longUpdater; jaroslav@1779: static AtomicLongFieldUpdater getLongUpdater() { jaroslav@1779: if (longUpdater == null) { jaroslav@1779: longUpdater = AtomicLongFieldUpdater.newUpdater(AtomicTest.class, "longValue"); jaroslav@1779: } jaroslav@1779: return longUpdater; jaroslav@1779: } jaroslav@1779: private volatile Number refValue; jaroslav@1779: private static AtomicReferenceFieldUpdater refUpdater; jaroslav@1779: static AtomicReferenceFieldUpdater getRefUpdater() { jaroslav@1779: if (refUpdater == null) { jaroslav@1779: refUpdater = AtomicReferenceFieldUpdater.newUpdater(AtomicTest.class, Number.class, "refValue"); jaroslav@1779: } jaroslav@1779: return refUpdater; jaroslav@1779: } jaroslav@1779: jaroslav@1338: @Compare public boolean atomicBoolean() { jaroslav@1338: AtomicBoolean ab = new AtomicBoolean(); jaroslav@1338: ab.set(true); jaroslav@1338: return ab.compareAndSet(true, false); jaroslav@1338: } jaroslav@1338: jaroslav@1338: @Compare public int atomicInt() { jaroslav@1338: AtomicInteger ab = new AtomicInteger(); jaroslav@1338: ab.set(30); jaroslav@1338: assert ab.compareAndSet(30, 10); jaroslav@1338: return ab.get(); jaroslav@1338: } jaroslav@1338: jaroslav@1338: @Compare public String atomicRef() { jaroslav@1338: AtomicReference ar = new AtomicReference("Ahoj"); jaroslav@1338: assert ar.compareAndSet("Ahoj", "Hello"); jaroslav@1338: return ar.getAndSet("Other"); jaroslav@1338: } jaroslav@1338: jaroslav@1779: @Compare public int intUpdater() { jaroslav@1779: intValue = Integer.MAX_VALUE / 2; jaroslav@1779: final AtomicIntegerFieldUpdater u = getIntUpdater(); jaroslav@1779: u.compareAndSet(this, 0, 10); jaroslav@1779: u.addAndGet(this, 3); jaroslav@1779: int thirteen = u.getAndAdd(this, 7); jaroslav@1779: return thirteen + u.get(this); jaroslav@1779: } jaroslav@1779: jaroslav@1779: @Compare public long longUpdater() { jaroslav@1779: longValue = Long.MAX_VALUE / 2; jaroslav@1779: final AtomicLongFieldUpdater u = getLongUpdater(); jaroslav@1779: u.compareAndSet(this, 0, 10); jaroslav@1779: u.addAndGet(this, 3); jaroslav@1779: long thirteen = u.getAndAdd(this, 7); jaroslav@1779: return thirteen + u.get(this); jaroslav@1779: } jaroslav@1779: jaroslav@1779: @Compare public int refUpdater() { jaroslav@1779: final AtomicReferenceFieldUpdater u = getRefUpdater(); jaroslav@1779: u.set(this, 0); jaroslav@1779: u.compareAndSet(this, 0, 10); jaroslav@1779: Number ten = u.getAndSet(this, 3); jaroslav@1779: return u.get(this).intValue() + ten.intValue(); jaroslav@1779: } jaroslav@1779: jaroslav@1338: @Factory public static Object[] create() { jaroslav@1338: return VMTest.create(AtomicTest.class); jaroslav@1338: } jaroslav@1338: }