Make SingleThreadMarkAndSweep support multiple threads

This commit is contained in:
Alexander Shabalin
2021-05-21 13:59:22 +03:00
committed by Space
parent 10ae9c511b
commit 9ebba93dd9
15 changed files with 556 additions and 127 deletions
@@ -25,6 +25,7 @@ fun main() {
worker.requestTermination().result
waitWorkerTermination(worker)
GC.collect()
waitCleanerWorker()
assertEquals(42, value.value)
@@ -59,27 +59,36 @@ data class Data(var int: Int)
assertFailsWith<InvalidMutabilityException> { a8[1] = 2.0 }
// Ensure that String and integral boxes are frozen by default, by passing local to the worker.
val hasToBeFrozen = Platform.memoryModel == MemoryModel.STRICT
val worker = Worker.start()
var data: Any = "Hello" + " " + "world"
assert(data.isFrozen)
if (hasToBeFrozen) {
assertTrue(data.isFrozen)
}
worker.execute(TransferMode.SAFE, { data } ) {
input -> println("Worker 1: $input")
}.result
data = 42
assert(data.isFrozen)
if (hasToBeFrozen) {
assertTrue(data.isFrozen)
}
worker.execute(TransferMode.SAFE, { data } ) {
input -> println("Worker2: $input")
}.result
data = 239.0
assert(data.isFrozen)
if (hasToBeFrozen) {
assertTrue(data.isFrozen)
}
worker.execute(TransferMode.SAFE, { data } ) {
input -> println("Worker3: $input")
}.result
data = 'a'
assert(data.isFrozen)
if (hasToBeFrozen) {
assertTrue(data.isFrozen)
}
worker.execute(TransferMode.SAFE, { data } ) {
input -> println("Worker4: $input")
}.result
@@ -87,4 +96,4 @@ data class Data(var int: Int)
worker.requestTermination().result
println("OK")
}
}