temporarily using threads instead of who-knows-what-the-fucks-have-changed new coroutine

This commit is contained in:
minjaesong
2023-05-04 14:00:57 +09:00
parent e3930c69a2
commit 9adcce746b
8 changed files with 31 additions and 37 deletions

View File

@@ -1,6 +1,5 @@
package net.torvald.tsvm
import kotlin.coroutines.Job
import net.torvald.UnsafeHelper
import net.torvald.UnsafePtr
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toHex

View File

@@ -1,13 +1,9 @@
package net.torvald.tsvm
import kotlin.coroutines.GlobalScope
import kotlin.coroutines.Job
import kotlin.coroutines.launch
import net.torvald.UnsafeHelper
import net.torvald.UnsafePtr
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUlong
import net.torvald.tsvm.peripheral.*
import java.nio.charset.Charset
/**
* Pass the instance of the class to the ScriptEngine's binding, preferably under the namespace of "vm"

View File

@@ -8,8 +8,8 @@ import java.io.FileReader
import javax.script.ScriptEngineManager
abstract class VMRunner(val extension: String) {
abstract suspend fun evalGlobal(command: String) // Ring 0
abstract suspend fun executeCommand(command: String) // Ring 1
abstract fun evalGlobal(command: String) // Ring 0
abstract fun executeCommand(command: String) // Ring 1
abstract fun eval(command: String) // Ring 2 (for child processes spawned using Parallel API)
abstract fun close()
}
@@ -34,7 +34,7 @@ object VMRunnerFactory {
val engine =
Videotron2K(vm.findPeribyType(VM.PERITYPE_GPU_AND_TERM)!!.peripheral!! as GraphicsAdapter)
override suspend fun executeCommand(command: String) {
override fun executeCommand(command: String) {
engine.eval(command)
}
@@ -42,7 +42,7 @@ object VMRunnerFactory {
TODO("Not yet implemented")
}
override suspend fun evalGlobal(command: String) {
override fun evalGlobal(command: String) {
TODO("Not yet implemented")
}
@@ -83,7 +83,7 @@ object VMRunnerFactory {
context.eval("js", sanitiseJS(prg))
}
override suspend fun executeCommand(command: String) {
override fun executeCommand(command: String) {
try {
bind.putMember("parallel", ringOneParallel)
context.eval("js", encapsulateJS(sanitiseJS(command)))
@@ -106,7 +106,7 @@ object VMRunnerFactory {
throw e
} }
override suspend fun evalGlobal(command: String) {
override fun evalGlobal(command: String) {
bind.putMember("parallel", ringOneParallel)
context.eval("js", "\"use strict\";" + sanitiseJS(command))
}

View File

@@ -22,7 +22,7 @@ object VMSetupBroker {
* @param vmRunners Hashmap on the host of VMs that holds the instances of the VMRunners for the given VM. Key: Int(VM's identifier), value: [net.torvald.tsvm.VMRunner]
* @param coroutineJobs Hashmap on the host of VMs that holds the coroutine-job object for the currently running VM-instance. Key: Int(VM's identifier), value: [kotlin.coroutines.Job]
*/
fun initVMenv(vm: VM, profileJson: JsonValue, profileName: String, gpu: GraphicsAdapter, vmRunners: HashMap<VmId, VMRunner>, coroutineJobs: HashMap<VmId, Job>, whatToDoOnVmException: (Throwable) -> Unit) {
fun initVMenv(vm: VM, profileJson: JsonValue, profileName: String, gpu: GraphicsAdapter, vmRunners: HashMap<VmId, VMRunner>, coroutineJobs: HashMap<VmId, Thread>, whatToDoOnVmException: (Throwable) -> Unit) {
vm.init()
try {
@@ -40,13 +40,16 @@ object VMSetupBroker {
vm.poke(-90L, 0)
vmRunners[vm.id] = VMRunnerFactory(vm.assetsDir, vm, "js")
coroutineJobs[vm.id] = GlobalScope.launch {
Thread({
try {
vmRunners[vm.id]?.executeCommand(vm.roms[0].readAll())
}
catch (e: Throwable) {
whatToDoOnVmException(e)
}
}, "VmRunner:${vm.id}").let {
coroutineJobs[vm.id] = it
it.start()
}
}
@@ -57,7 +60,7 @@ object VMSetupBroker {
* @param vmRunners Hashmap on the host of VMs that holds the instances of the VMRunners for the given VM. Key: Int(VM's identifier), value: [net.torvald.tsvm.VMRunner]
* @param coroutineJobs Hashmap on the host of VMs that holds the coroutine-job object for the currently running VM-instance. Key: Int(VM's identifier), value: [kotlin.coroutines.Job]
*/
fun killVMenv(vm: VM, vmRunners: HashMap<VmId, VMRunner>, coroutineJobs: HashMap<VmId, Job>) {
fun killVMenv(vm: VM, vmRunners: HashMap<VmId, VMRunner>, coroutineJobs: HashMap<VmId, Thread>) {
vm.park()
vm.poke(-90L, -128)
@@ -69,7 +72,7 @@ object VMSetupBroker {
catch (_: Throwable) {}
}
coroutineJobs[vm.id]?.cancel("VM kill command received")
coroutineJobs[vm.id]?.interrupt()
vmRunners[vm.id]?.close()
vm.getPrintStream = { TODO() }

View File

@@ -7,9 +7,6 @@ import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration
import com.badlogic.gdx.graphics.OrthographicCamera
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.glutils.ShaderProgram
import kotlin.coroutines.GlobalScope
import kotlin.coroutines.Job
import kotlin.coroutines.launch
import net.torvald.terrarum.DefaultGL32Shaders
import net.torvald.tsvm.*
import net.torvald.tsvm.peripheral.GraphicsAdapter
@@ -24,7 +21,7 @@ class V2kRunTest : ApplicationAdapter() {
lateinit var vmRunner: VMRunner
lateinit var coroutineJob: Job
lateinit var coroutineJob: Thread
lateinit var vdc: Videotron2K
override fun create() {
@@ -53,9 +50,9 @@ class V2kRunTest : ApplicationAdapter() {
vdc = Videotron2K(gpu)
vmRunner = VMRunnerFactory("./assets", vm, "js")
coroutineJob = GlobalScope.launch {
coroutineJob = Thread({
vdc.eval(Videotron2K.screenfiller)
}
}, "VmRunner:${vm.id}")
Gdx.input.inputProcessor = vm.getIO()
@@ -96,7 +93,7 @@ class V2kRunTest : ApplicationAdapter() {
override fun dispose() {
super.dispose()
batch.dispose()
coroutineJob.cancel()
coroutineJob.interrupt()
vm.dispose()
}
}