Files
kotlin-fork/plugins/atomicfu/atomicfu-compiler/testData/box/LockFreeQueueTest.kt
T
mvicsokolova 93561a1a55 kotlinx.atomicfu compiler plugin for JS_IR backend (#4581)
* kotlinx.atomicfu compiler plugin for JS_IR

Support transformations of atomic operations introduced by the kotlinx.atomicfu library for the JS_IR backend. Compiler plugin is applied externally by the kotlinx.atomicfu gradle plugin.

* Apply compiler plugin for JS platform only

* New plugin test structure

* testGroupOutputDirPrefix changed
2021-12-01 22:33:13 +03:00

55 lines
1.3 KiB
Kotlin
Vendored

import kotlinx.atomicfu.*
import kotlin.test.*
class LockFreeQueueTest {
fun testBasic() {
val q = LockFreeQueue()
check(q.dequeue() == -1)
q.enqueue(42)
check(q.dequeue() == 42)
check(q.dequeue() == -1)
q.enqueue(1)
q.enqueue(2)
check(q.dequeue() == 1)
check(q.dequeue() == 2)
check(q.dequeue() == -1)
}
}
// MS-queue
public class LockFreeQueue {
private val head = atomic(Node(0))
private val tail = atomic(head.value)
private class Node(val value: Int) {
val next = atomic<Node?>(null)
}
public fun enqueue(value: Int) {
val node = Node(value)
tail.loop { curTail ->
val curNext = curTail.next.value
if (curNext != null) {
tail.compareAndSet(curTail, curNext)
return@loop
}
if (curTail.next.compareAndSet(null, node)) {
tail.compareAndSet(curTail, node)
return
}
}
}
public fun dequeue(): Int {
head.loop { curHead ->
val next = curHead.next.value ?: return -1
if (head.compareAndSet(curHead, next)) return next.value
}
}
}
fun box(): String {
val testClass = LockFreeQueueTest()
testClass.testBasic()
return "OK"
}