kotlinx.atomicfu JVM/IR compiler plugin support

Merge-request: KT-MR-6541
Merged-by: Maria Sokolova <maria.sokolova@jetbrains.com>
This commit is contained in:
mvicsokolova
2022-06-26 07:17:06 +00:00
committed by Space
parent eaad75fd52
commit 8053746ae0
62 changed files with 4249 additions and 349 deletions
@@ -18,126 +18,125 @@ private val stringAtomicNullArr = atomicArrayOfNulls<String>(10)
class TopLevelPrimitiveTest {
fun testTopLevelInt() {
a.value
check(a.value == 0)
check(a.getAndSet(3) == 0)
check(a.compareAndSet(3, 8))
assertEquals(0, a.value)
assertEquals(0, a.getAndSet(3))
assertTrue(a.compareAndSet(3, 8))
a.lazySet(1)
check(a.value == 1)
check(a.getAndSet(2) == 1)
check(a.value == 2)
check(a.getAndIncrement() == 2)
check(a.value == 3)
check(a.getAndDecrement() == 3)
check(a.value == 2)
check(a.getAndAdd(2) == 2)
check(a.value == 4)
check(a.addAndGet(3) == 7)
check(a.value == 7)
check(a.incrementAndGet() == 8)
check(a.value == 8)
check(a.decrementAndGet() == 7)
check(a.value == 7)
a.compareAndSet(7, 10)
assertEquals(1, a.value)
assertEquals(1, a.getAndSet(2))
assertEquals(2, a.value)
assertEquals(2, a.getAndIncrement())
assertEquals(3, a.value)
assertEquals(3, a.getAndDecrement())
assertEquals(2, a.value)
assertEquals(2, a.getAndAdd(2))
assertEquals(4, a.value)
assertEquals(7, a.addAndGet(3))
assertEquals(7, a.value)
assertEquals(8, a.incrementAndGet())
assertEquals(8, a.value)
assertEquals(7, a.decrementAndGet())
assertEquals(7, a.value)
assertTrue(a.compareAndSet(7, 10))
}
fun testTopLevelLong() {
check(b.value == 2424920024888888848)
assertEquals(2424920024888888848, b.value)
b.lazySet(8424920024888888848)
check(b.value == 8424920024888888848)
check(b.getAndSet(8924920024888888848) == 8424920024888888848)
check(b.value == 8924920024888888848)
check(b.incrementAndGet() == 8924920024888888849)
check(b.value == 8924920024888888849)
check(b.getAndDecrement() == 8924920024888888849)
check(b.value == 8924920024888888848)
check(b.getAndAdd(100000000000000000) == 8924920024888888848)
check(b.value == 9024920024888888848)
check(b.addAndGet(-9223372036854775807) == -198452011965886959)
check(b.value == -198452011965886959)
check(b.incrementAndGet() == -198452011965886958)
check(b.value == -198452011965886958)
check(b.decrementAndGet() == -198452011965886959)
check(b.value == -198452011965886959)
assertEquals(8424920024888888848, b.value)
assertEquals(8424920024888888848, b.getAndSet(8924920024888888848))
assertEquals(8924920024888888848, b.value)
assertEquals(8924920024888888849, b.incrementAndGet())
assertEquals(8924920024888888849, b.value)
assertEquals(8924920024888888849, b.getAndDecrement())
assertEquals(8924920024888888848, b.value)
assertEquals(8924920024888888848, b.getAndAdd(100000000000000000))
assertEquals(9024920024888888848, b.value)
assertEquals(-198452011965886959, b.addAndGet(-9223372036854775807))
assertEquals(-198452011965886959, b.value)
assertEquals(-198452011965886958, b.incrementAndGet())
assertEquals(-198452011965886958, b.value)
assertEquals(-198452011965886959, b.decrementAndGet())
assertEquals(-198452011965886959, b.value)
}
fun testTopLevelBoolean() {
check(c.value)
assertTrue(c.value)
c.lazySet(false)
check(!c.value)
check(!c.getAndSet(true))
check(c.compareAndSet(true, false))
check(!c.value)
assertFalse(c.value)
assertTrue(!c.getAndSet(true))
assertTrue(c.compareAndSet(true, false))
assertFalse(c.value)
}
fun testTopLevelRef() {
check(abcNode.value.b.c.d == 8)
assertEquals(8, abcNode.value.b.c.d)
val newNode = ANode(BNode(CNode(76)))
check(abcNode.getAndSet(newNode).b.c.d == 8)
check(abcNode.value.b.c.d == 76)
assertEquals(8, abcNode.getAndSet(newNode).b.c.d)
assertEquals(76, abcNode.value.b.c.d)
val l = IntArray(4){i -> i}
any.lazySet(l)
check((any.value as IntArray)[2] == 2)
assertEquals(2, (any.value as IntArray)[2])
}
fun testTopLevelArrayOfNulls() {
check(stringAtomicNullArr[0].value == null)
check(stringAtomicNullArr[0].compareAndSet(null, "aa"))
assertEquals(null, stringAtomicNullArr[0].value)
assertTrue(stringAtomicNullArr[0].compareAndSet(null, "aa"))
stringAtomicNullArr[1].lazySet("aa")
check(stringAtomicNullArr[0].value == stringAtomicNullArr[1].value)
assertTrue(stringAtomicNullArr[0].value == stringAtomicNullArr[1].value)
}
}
class TopLevelArrayTest {
fun testIntArray() {
check(intArr[0].compareAndSet(0, 3))
check(intArr[1].value == 0)
assertTrue(intArr[0].compareAndSet(0, 3))
assertEquals(0, intArr[1].value)
intArr[0].lazySet(5)
check(intArr[0].value + intArr[1].value + intArr[2].value == 5)
check(intArr[0].compareAndSet(5, 10))
check(intArr[0].getAndDecrement() == 10)
check(intArr[0].value == 9)
assertEquals(5, intArr[0].value + intArr[1].value + intArr[2].value)
assertTrue(intArr[0].compareAndSet(5, 10))
assertEquals(10, intArr[0].getAndDecrement())
assertEquals(9, intArr[0].value)
intArr[2].value = 2
check(intArr[2].value == 2)
check(intArr[2].compareAndSet(2, 34))
check(intArr[2].value == 34)
assertEquals(2, intArr[2].value)
assertTrue(intArr[2].compareAndSet(2, 34))
assertEquals(34, intArr[2].value)
}
fun testLongArray() {
longArr[0].value = 2424920024888888848
check(longArr[0].value == 2424920024888888848)
assertEquals(2424920024888888848, longArr[0].value)
longArr[0].lazySet(8424920024888888848)
check(longArr[0].value == 8424920024888888848)
assertEquals(8424920024888888848, longArr[0].value)
val ac = longArr[0].value
longArr[3].value = ac
check(longArr[3].getAndSet(8924920024888888848) == 8424920024888888848)
check(longArr[3].value == 8924920024888888848)
assertEquals(8424920024888888848, longArr[3].getAndSet(8924920024888888848))
assertEquals(8924920024888888848, longArr[3].value)
val ac1 = longArr[3].value
longArr[4].value = ac1
check(longArr[4].incrementAndGet() == 8924920024888888849)
check(longArr[4].value == 8924920024888888849)
check(longArr[4].getAndDecrement() == 8924920024888888849)
check(longArr[4].value == 8924920024888888848)
assertEquals(8924920024888888849, longArr[4].incrementAndGet())
assertEquals(8924920024888888849, longArr[4].value)
assertEquals(8924920024888888849, longArr[4].getAndDecrement())
assertEquals(8924920024888888848, longArr[4].value)
longArr[4].value = 8924920024888888848
check(longArr[4].getAndAdd(100000000000000000) == 8924920024888888848)
assertEquals(8924920024888888848, longArr[4].getAndAdd(100000000000000000))
val ac2 = longArr[4].value
longArr[1].value = ac2
check(longArr[1].value == 9024920024888888848)
check(longArr[1].addAndGet(-9223372036854775807) == -198452011965886959)
check(longArr[1].value == -198452011965886959)
check(longArr[1].incrementAndGet() == -198452011965886958)
check(longArr[1].value == -198452011965886958)
check(longArr[1].decrementAndGet() == -198452011965886959)
check(longArr[1].value == -198452011965886959)
assertEquals(9024920024888888848, longArr[1].value)
assertEquals(-198452011965886959, longArr[1].addAndGet(-9223372036854775807))
assertEquals(-198452011965886959, longArr[1].value)
assertEquals(-198452011965886958, longArr[1].incrementAndGet())
assertEquals(-198452011965886958, longArr[1].value)
assertEquals(-198452011965886959, longArr[1].decrementAndGet())
assertEquals(-198452011965886959, longArr[1].value)
}
fun testBooleanArray() {
check(!booleanArr[1].value)
assertFalse(booleanArr[1].value)
booleanArr[1].compareAndSet(false, true)
booleanArr[0].lazySet(true)
check(!booleanArr[2].getAndSet(true))
check(booleanArr[0].value && booleanArr[1].value && booleanArr[2].value)
assertFalse(booleanArr[2].getAndSet(true))
assertTrue(booleanArr[0].value && booleanArr[1].value && booleanArr[2].value)
}
@Suppress("UNCHECKED_CAST")
@@ -145,14 +144,14 @@ class TopLevelArrayTest {
val a2 = ANode(BNode(CNode(2)))
val a3 = ANode(BNode(CNode(3)))
refArr[0].value = a2
check(refArr[0].value!!.b.c.d == 2)
check(refArr[0].compareAndSet(a2, a3))
check(refArr[0].value!!.b.c.d == 3)
assertEquals(2, refArr[0].value!!.b.c.d)
assertTrue(refArr[0].compareAndSet(a2, a3))
assertEquals(3, refArr[0].value!!.b.c.d)
val r0 = refArr[0].value
refArr[3].value = r0
check(refArr[3].value!!.b.c.d == 3)
assertEquals(3, refArr[3].value!!.b.c.d)
val a = abcNode.value
check(refArr[3].compareAndSet(a3, a))
assertTrue(refArr[3].compareAndSet(a3, a))
}
}