Do not require freezing for Worker.executeAfter on experimental MM

This commit is contained in:
Alexander Shabalin
2021-06-22 16:12:55 +03:00
committed by Space
parent 16e9c74523
commit cc71069a3a
3 changed files with 16 additions and 6 deletions

View File

@@ -949,7 +949,11 @@ task worker8(type: KonanLocalTest) {
task worker9(type: KonanLocalTest) {
enabled = (project.testTarget != 'wasm32') // Workers need pthreads.
goldValue = "zzz\n42\nOK\nfirst 2\nsecond 3\nfrozen OK\n"
if (isExperimentalMM) {
goldValue = "zzz\n42\nOK\nfirst 2\nsecond 3\nunfrozen OK\nfrozen OK\n"
} else {
goldValue = "zzz\n42\nOK\nfirst 2\nsecond 3\nfrozen OK\n"
}
source = "runtime/workers/worker9.kt"
}

View File

@@ -43,9 +43,15 @@ fun withLock(op: () -> Unit) {
@Test fun runTest3() {
val worker = Worker.start()
assertFailsWith<IllegalStateException> {
if (Platform.memoryModel == MemoryModel.EXPERIMENTAL) {
worker.executeAfter {
println("shall not happen")
println("unfrozen OK")
}
} else {
assertFailsWith<IllegalStateException> {
worker.executeAfter {
println("shall not happen")
}
}
}
assertFailsWith<IllegalArgumentException> {
@@ -81,4 +87,4 @@ fun makeCyclic(): Node {
}
assert(future.result != null)
worker.requestTermination().result
}
}

View File

@@ -106,7 +106,7 @@ public inline class Worker @PublishedApi internal constructor(val id: Int) {
*/
public fun executeAfter(afterMicroseconds: Long = 0, operation: () -> Unit): Unit {
val current = currentInternal()
if (current != id && !operation.isFrozen) throw IllegalStateException("Job for another worker must be frozen")
if (Platform.memoryModel != MemoryModel.EXPERIMENTAL && current != id && !operation.isFrozen) throw IllegalStateException("Job for another worker must be frozen")
if (afterMicroseconds < 0) throw IllegalArgumentException("Timeout parameter must be non-negative")
executeAfterInternal(id, operation, afterMicroseconds)
}
@@ -187,4 +187,4 @@ public inline fun <R> withWorker(name: String? = null, errorReporting: Boolean =
} finally {
worker.requestTermination().result
}
}
}