blob: 22dd4cab769130e75fc4708d96b43d6dcadb3878 [file]
// FREE_COMPILER_ARGS: -opt-in=kotlin.experimental.ExperimentalNativeApi,kotlin.native.runtime.NativeRuntimeApi,kotlin.native.internal.InternalForKotlinNative
import kotlin.concurrent.AtomicInt
import kotlin.native.concurrent.*
import kotlin.native.runtime.GC
import kotlin.test.*
const val WORKER_COUNT = 100
@Test
fun runTest() {
val canUnblockQueue = AtomicInt(0)
val workers = Array(WORKER_COUNT) { Worker.start(name = "Worker #$it") }
val terminationFutures = workers.map {
it.execute(TransferMode.SAFE, { canUnblockQueue }) { canUnblockQueue ->
while (canUnblockQueue.value == 0) {}
}
val terminateRequestFuture = it.requestTermination()
it.execute(TransferMode.SAFE, {}) { error("Executed job after termination") }
terminateRequestFuture
}
// All queues are ready. Unblock the first task, schedule GC, and wait for all termination requests.
GC.schedule()
canUnblockQueue.value = 1
terminationFutures.forEach { it.result }
// And now wait for all the workers to complete termination.
workers.forEach { waitWorkerTermination(it) }
}