rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/AtomicTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 10 May 2016 04:52:05 +0200
changeset 1962 9d46ae9d4a2e
parent 1779 9d757281c666
permissions -rw-r--r--
Don't obfuscate names of fields in objects - otherwise fields provided by two modules may clash
jaroslav@1338
     1
/**
jaroslav@1338
     2
 * Back 2 Browser Bytecode Translator
jaroslav@1787
     3
 * Copyright (C) 2012-2015 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@1338
     4
 *
jaroslav@1338
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@1338
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@1338
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@1338
     8
 *
jaroslav@1338
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@1338
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@1338
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@1338
    12
 * GNU General Public License for more details.
jaroslav@1338
    13
 *
jaroslav@1338
    14
 * You should have received a copy of the GNU General Public License
jaroslav@1338
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@1338
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@1338
    17
 */
jaroslav@1338
    18
package org.apidesign.bck2brwsr.tck;
jaroslav@1338
    19
jaroslav@1338
    20
import java.util.concurrent.atomic.AtomicBoolean;
jaroslav@1338
    21
import java.util.concurrent.atomic.AtomicInteger;
jaroslav@1779
    22
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
jaroslav@1779
    23
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
jaroslav@1338
    24
import java.util.concurrent.atomic.AtomicReference;
jaroslav@1779
    25
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
jaroslav@1338
    26
import org.apidesign.bck2brwsr.vmtest.Compare;
jaroslav@1338
    27
import org.apidesign.bck2brwsr.vmtest.VMTest;
jaroslav@1338
    28
import org.testng.annotations.Factory;
jaroslav@1338
    29
jaroslav@1338
    30
/**
jaroslav@1338
    31
 *
jaroslav@1338
    32
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@1338
    33
 */
jaroslav@1338
    34
public class AtomicTest {
jaroslav@1779
    35
    private volatile int intValue;
jaroslav@1779
    36
    private static AtomicIntegerFieldUpdater<AtomicTest> intUpdater;
jaroslav@1779
    37
    static AtomicIntegerFieldUpdater<AtomicTest> getIntUpdater() {
jaroslav@1779
    38
        if (intUpdater == null) {
jaroslav@1779
    39
            intUpdater = AtomicIntegerFieldUpdater.newUpdater(AtomicTest.class, "intValue");
jaroslav@1779
    40
        }
jaroslav@1779
    41
        return intUpdater;
jaroslav@1779
    42
    }
jaroslav@1779
    43
    private volatile long longValue;
jaroslav@1779
    44
    private static AtomicLongFieldUpdater<AtomicTest> longUpdater;
jaroslav@1779
    45
    static AtomicLongFieldUpdater<AtomicTest> getLongUpdater() {
jaroslav@1779
    46
        if (longUpdater == null) {
jaroslav@1779
    47
            longUpdater = AtomicLongFieldUpdater.newUpdater(AtomicTest.class, "longValue");
jaroslav@1779
    48
        }
jaroslav@1779
    49
        return longUpdater;
jaroslav@1779
    50
    }
jaroslav@1779
    51
    private volatile Number refValue;
jaroslav@1779
    52
    private static AtomicReferenceFieldUpdater<AtomicTest,Number> refUpdater;
jaroslav@1779
    53
    static AtomicReferenceFieldUpdater<AtomicTest,Number> getRefUpdater() {
jaroslav@1779
    54
        if (refUpdater == null) {
jaroslav@1779
    55
            refUpdater = AtomicReferenceFieldUpdater.newUpdater(AtomicTest.class, Number.class, "refValue");
jaroslav@1779
    56
        }
jaroslav@1779
    57
        return refUpdater;
jaroslav@1779
    58
    }
jaroslav@1779
    59
    
jaroslav@1338
    60
    @Compare public boolean atomicBoolean() {
jaroslav@1338
    61
        AtomicBoolean ab = new AtomicBoolean();
jaroslav@1338
    62
        ab.set(true);
jaroslav@1338
    63
        return ab.compareAndSet(true, false);
jaroslav@1338
    64
    }
jaroslav@1338
    65
jaroslav@1338
    66
    @Compare public int atomicInt() {
jaroslav@1338
    67
        AtomicInteger ab = new AtomicInteger();
jaroslav@1338
    68
        ab.set(30);
jaroslav@1338
    69
        assert ab.compareAndSet(30, 10);
jaroslav@1338
    70
        return ab.get();
jaroslav@1338
    71
    }
jaroslav@1338
    72
    
jaroslav@1338
    73
    @Compare public String atomicRef() {
jaroslav@1338
    74
        AtomicReference<String> ar = new AtomicReference<String>("Ahoj");
jaroslav@1338
    75
        assert ar.compareAndSet("Ahoj", "Hello");
jaroslav@1338
    76
        return ar.getAndSet("Other");
jaroslav@1338
    77
    }
jaroslav@1338
    78
    
jaroslav@1779
    79
    @Compare public int intUpdater() {
jaroslav@1779
    80
        intValue = Integer.MAX_VALUE / 2;
jaroslav@1779
    81
        final AtomicIntegerFieldUpdater<AtomicTest> u = getIntUpdater();
jaroslav@1779
    82
        u.compareAndSet(this, 0, 10);
jaroslav@1779
    83
        u.addAndGet(this, 3);
jaroslav@1779
    84
        int thirteen = u.getAndAdd(this, 7);
jaroslav@1779
    85
        return thirteen + u.get(this);
jaroslav@1779
    86
    }
jaroslav@1779
    87
jaroslav@1779
    88
    @Compare public long longUpdater() {
jaroslav@1779
    89
        longValue = Long.MAX_VALUE / 2;
jaroslav@1779
    90
        final AtomicLongFieldUpdater<AtomicTest> u = getLongUpdater();
jaroslav@1779
    91
        u.compareAndSet(this, 0, 10);
jaroslav@1779
    92
        u.addAndGet(this, 3);
jaroslav@1779
    93
        long thirteen = u.getAndAdd(this, 7);
jaroslav@1779
    94
        return thirteen + u.get(this);
jaroslav@1779
    95
    }
jaroslav@1779
    96
jaroslav@1779
    97
    @Compare public int refUpdater() {
jaroslav@1779
    98
        final AtomicReferenceFieldUpdater<AtomicTest,Number> u = getRefUpdater();
jaroslav@1779
    99
        u.set(this, 0);
jaroslav@1779
   100
        u.compareAndSet(this, 0, 10);
jaroslav@1779
   101
        Number ten = u.getAndSet(this, 3);
jaroslav@1779
   102
        return u.get(this).intValue() + ten.intValue();
jaroslav@1779
   103
    }
jaroslav@1779
   104
    
jaroslav@1338
   105
    @Factory public static Object[] create() {
jaroslav@1338
   106
        return VMTest.create(AtomicTest.class);
jaroslav@1338
   107
    }
jaroslav@1338
   108
}