f624800b84
I was forced to manually do update the following files, because otherwise they would be ignored according .gitignore settings. Probably they should be deleted from repo. Interop/.idea/compiler.xml Interop/.idea/gradle.xml Interop/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_3.xml Interop/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_3.xml Interop/.idea/modules.xml Interop/.idea/modules/Indexer/Indexer.iml Interop/.idea/modules/Runtime/Runtime.iml Interop/.idea/modules/StubGenerator/StubGenerator.iml backend.native/backend.native.iml backend.native/bc.frontend/bc.frontend.iml backend.native/cli.bc/cli.bc.iml backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt backend.native/tests/link/lib/foo.kt backend.native/tests/link/lib/foo2.kt backend.native/tests/teamcity-test.property
59 lines
1.5 KiB
Kotlin
59 lines
1.5 KiB
Kotlin
/*
|
|
* Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
|
* that can be found in the LICENSE file.
|
|
*/
|
|
|
|
// Note: This test reproduces a race, so it'll start flaking if problem is reintroduced.
|
|
|
|
import kotlin.test.*
|
|
|
|
import kotlin.native.concurrent.*
|
|
import kotlin.native.internal.*
|
|
|
|
val thrashGC = AtomicInt(1)
|
|
val canStartCreating = AtomicInt(0)
|
|
val createdCount = AtomicInt(0)
|
|
val canStartReading = AtomicInt(0)
|
|
const val atomicsCount = 1000
|
|
const val workersCount = 10
|
|
|
|
fun main() {
|
|
val gcWorker = Worker.start()
|
|
val future = gcWorker.execute(TransferMode.SAFE, {}, {
|
|
canStartCreating.value = 1
|
|
while (thrashGC.value != 0) {
|
|
GC.collectCyclic()
|
|
}
|
|
GC.collect()
|
|
})
|
|
|
|
while (canStartCreating.value == 0) {}
|
|
|
|
val workers = Array(workersCount) { Worker.start() }
|
|
val futures = workers.map {
|
|
it.execute(TransferMode.SAFE, {}, {
|
|
val atomics = Array(atomicsCount) {
|
|
AtomicReference<Any?>(Any().freeze())
|
|
}
|
|
createdCount.increment()
|
|
while (canStartReading.value == 0) {}
|
|
GC.collect()
|
|
atomics.all { it.value != null }
|
|
})
|
|
}
|
|
|
|
while (createdCount.value != workersCount) {}
|
|
|
|
thrashGC.value = 0
|
|
future.result
|
|
GC.collect()
|
|
canStartReading.value = 1
|
|
|
|
assertTrue(futures.all { it.result })
|
|
|
|
for (worker in workers) {
|
|
worker.requestTermination().result
|
|
}
|
|
gcWorker.requestTermination().result
|
|
}
|