diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/VMGUI.kt b/TerranBASICexecutable/src/net/torvald/tsvm/VMGUI.kt index 6621d94..fb4a846 100644 --- a/TerranBASICexecutable/src/net/torvald/tsvm/VMGUI.kt +++ b/TerranBASICexecutable/src/net/torvald/tsvm/VMGUI.kt @@ -41,7 +41,7 @@ class VMGUI(val loaderInfo: EmulInstance, val viewportWidth: Int, val viewportHe var gpu: GraphicsAdapter? = null lateinit var vmRunner: VMRunner - lateinit var coroutineJob: Job + lateinit var coroutineJob: Thread lateinit var fullscreenQuad: Mesh override fun create() { @@ -110,16 +110,17 @@ class VMGUI(val loaderInfo: EmulInstance, val viewportWidth: Int, val viewportHe vmRunner = VMRunnerFactory("./assets", vm, "js") - coroutineJob = GlobalScope.launch { + coroutineJob = Thread({ vmRunner.executeCommand(vm.roms[0]!!.readAll()) - } + }, "VmRunner:${vm.id}") + coroutineJob.start() } private var rebootRequested = false private fun reboot() { vmRunner.close() - coroutineJob.cancel("reboot requested") + coroutineJob.interrupt() vm.init() init() @@ -208,7 +209,7 @@ class VMGUI(val loaderInfo: EmulInstance, val viewportWidth: Int, val viewportHe super.dispose() batch.dispose() fullscreenQuad.dispose() - coroutineJob.cancel() + coroutineJob.interrupt() vm.dispose() } diff --git a/tsvm_core/src/net/torvald/tsvm/VM.kt b/tsvm_core/src/net/torvald/tsvm/VM.kt index 4872f73..8dbcbe1 100644 --- a/tsvm_core/src/net/torvald/tsvm/VM.kt +++ b/tsvm_core/src/net/torvald/tsvm/VM.kt @@ -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 diff --git a/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt b/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt index c67885f..593c92c 100644 --- a/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt +++ b/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt @@ -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" diff --git a/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt b/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt index 88a8c98..c12dc6e 100644 --- a/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt +++ b/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt @@ -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)) } diff --git a/tsvm_core/src/net/torvald/tsvm/VMSetupBroker.kt b/tsvm_core/src/net/torvald/tsvm/VMSetupBroker.kt index e744250..613d749 100644 --- a/tsvm_core/src/net/torvald/tsvm/VMSetupBroker.kt +++ b/tsvm_core/src/net/torvald/tsvm/VMSetupBroker.kt @@ -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, coroutineJobs: HashMap, whatToDoOnVmException: (Throwable) -> Unit) { + fun initVMenv(vm: VM, profileJson: JsonValue, profileName: String, gpu: GraphicsAdapter, vmRunners: HashMap, coroutineJobs: HashMap, 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, coroutineJobs: HashMap) { + fun killVMenv(vm: VM, vmRunners: HashMap, coroutineJobs: HashMap) { 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() } diff --git a/tsvm_core/src/net/torvald/tsvm/vdc/V2kRunTest.kt b/tsvm_core/src/net/torvald/tsvm/vdc/V2kRunTest.kt index 587b6e3..3544376 100644 --- a/tsvm_core/src/net/torvald/tsvm/vdc/V2kRunTest.kt +++ b/tsvm_core/src/net/torvald/tsvm/vdc/V2kRunTest.kt @@ -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() } } diff --git a/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt b/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt index 3d1d0ea..2a3d86a 100644 --- a/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt +++ b/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt @@ -8,8 +8,6 @@ import com.badlogic.gdx.graphics.* import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.utils.JsonValue import com.badlogic.gdx.utils.JsonWriter -import kotlin.coroutines.Job -import kotlin.coroutines.cancel import net.torvald.terrarum.DefaultGL32Shaders import net.torvald.terrarum.FlippingSpriteBatch import net.torvald.terrarum.imagefont.TinyAlphNum @@ -85,7 +83,7 @@ class VMEmuExecutable(val windowWidth: Int, val windowHeight: Int, var panelsX: lateinit var camera: OrthographicCamera var vmRunners = HashMap() // - var coroutineJobs = HashMap() // + var coroutineJobs = HashMap() // companion object { val APPDATADIR = TsvmEmulator.defaultDir @@ -277,7 +275,7 @@ class VMEmuExecutable(val windowWidth: Int, val windowHeight: Int, var panelsX: val vm = currentlyLoadedProfiles[profileName]!! vmRunners[vm.id]!!.close() - coroutineJobs[vm.id]!!.cancel("reboot requested") + coroutineJobs[vm.id]!!.interrupt() vm.init() initVMenv(vm, profileName) @@ -406,7 +404,7 @@ class VMEmuExecutable(val windowWidth: Int, val windowHeight: Int, var panelsX: batch.dispose() fbatch.dispose() fullscreenQuad.dispose() - coroutineJobs.values.forEach { it.cancel() } + coroutineJobs.values.forEach { it.interrupt() } vms.forEach { it?.vm?.dispose() } writeProfilesToFile(Gdx.files.absolute("$APPDATADIR/profiles.json")) diff --git a/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt b/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt index e9d92b5..33b85ce 100644 --- a/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt +++ b/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt @@ -43,7 +43,7 @@ class VMGUI(val loaderInfo: EmulInstance, val viewportWidth: Int, val viewportHe var gpu: GraphicsAdapter? = null lateinit var vmRunner: VMRunner - lateinit var coroutineJob: Job + lateinit var coroutineJob: Thread lateinit var memvwr: Memvwr lateinit var fullscreenQuad: Mesh @@ -115,16 +115,16 @@ class VMGUI(val loaderInfo: EmulInstance, val viewportWidth: Int, val viewportHe vmRunner = VMRunnerFactory(vm.assetsDir, vm, "js") - coroutineJob = GlobalScope.launch { + coroutineJob = Thread({ vmRunner.executeCommand(vm.roms[0]!!.readAll()) - } + }, "VmRunner:${vm.id}") } private var rebootRequested = false private fun reboot() { vmRunner.close() - coroutineJob.cancel("reboot requested") + coroutineJob.interrupt() vm.init() init() @@ -217,7 +217,7 @@ class VMGUI(val loaderInfo: EmulInstance, val viewportWidth: Int, val viewportHe super.dispose() batch.dispose() fullscreenQuad.dispose() - coroutineJob.cancel() + coroutineJob.interrupt() vm.dispose() }