From ff23b13ba0c042e0032c1619ba5a54e36fabf724 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 3 Jan 2023 01:52:38 +0900 Subject: [PATCH] exception on the vm should exit the app --- tsvm_core/src/net/torvald/tsvm/VMSetupBroker.kt | 13 ++++++++++--- .../src/net/torvald/tsvm/peripheral/AudioAdapter.kt | 11 ++++++++--- .../src/net/torvald/tsvm/TsvmEmulator.java | 8 +++++++- .../src/net/torvald/tsvm/VMEmuExecutable.kt | 5 ++++- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/tsvm_core/src/net/torvald/tsvm/VMSetupBroker.kt b/tsvm_core/src/net/torvald/tsvm/VMSetupBroker.kt index e3627bb..2765c0a 100644 --- a/tsvm_core/src/net/torvald/tsvm/VMSetupBroker.kt +++ b/tsvm_core/src/net/torvald/tsvm/VMSetupBroker.kt @@ -1,12 +1,12 @@ package net.torvald.tsvm +import com.badlogic.gdx.Gdx import com.badlogic.gdx.utils.GdxRuntimeException import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import net.torvald.tsvm.peripheral.GraphicsAdapter -import net.torvald.tsvm.peripheral.ReferenceGraphicsAdapter2 /** * Created by minjaesong on 2022-12-15. @@ -21,7 +21,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: [kotlinx.coroutines.Job] */ - fun initVMenv(vm: VM, gpu: GraphicsAdapter, vmRunners: HashMap, coroutineJobs: HashMap) { + fun initVMenv(vm: VM, gpu: GraphicsAdapter, vmRunners: HashMap, coroutineJobs: HashMap, whatToDoOnVmException: (Throwable) -> Unit) { vm.init() try { @@ -37,7 +37,14 @@ object VMSetupBroker { vm.poke(-90L, 0) vmRunners[vm.id] = VMRunnerFactory(vm.assetsDir, vm, "js") - coroutineJobs[vm.id] = GlobalScope.launch { vmRunners[vm.id]?.executeCommand(vm.roms[0]!!.readAll()) } + coroutineJobs[vm.id] = GlobalScope.launch { + try { + vmRunners[vm.id]?.executeCommand(vm.roms[0]!!.readAll()) + } + catch (e: Throwable) { + whatToDoOnVmException(e) + } + } } /** diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/AudioAdapter.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/AudioAdapter.kt index 1550c01..1bd38ef 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/AudioAdapter.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/AudioAdapter.kt @@ -1,13 +1,13 @@ package net.torvald.tsvm.peripheral import com.badlogic.gdx.Gdx -import com.badlogic.gdx.audio.AudioDevice import com.badlogic.gdx.backends.lwjgl3.audio.OpenALLwjgl3Audio import com.badlogic.gdx.utils.Queue import net.torvald.UnsafeHelper import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint import net.torvald.tsvm.ThreeFiveMiniUfloat import net.torvald.tsvm.VM +import kotlin.system.exitProcess private fun Boolean.toInt() = if (this) 1 else 0 @@ -36,6 +36,11 @@ class AudioAdapter(val vm: VM) : PeriBase { private val renderThreads = Array(4) { Thread(getRenderFun(it)) } private val writeQueueingThreads = Array(4) { Thread(getQueueingFun(it)) } + private val threadExceptionHandler = Thread.UncaughtExceptionHandler { thread, throwable -> + throwable.printStackTrace() + exitProcess(1) + } + private fun getRenderFun(pheadNum: Int): () -> Unit = { while (true) { render(playheads[pheadNum]) Thread.sleep(1) @@ -91,8 +96,8 @@ class AudioAdapter(val vm: VM) : PeriBase { // printdbg("AudioAdapter latency: ${audioDevice.latency}") - renderThreads.forEach { it.start() } - writeQueueingThreads.forEach { it.start() } + renderThreads.forEach { it.uncaughtExceptionHandler = threadExceptionHandler; it.start() } + writeQueueingThreads.forEach { it.uncaughtExceptionHandler = threadExceptionHandler; it.start() } } diff --git a/tsvm_executable/src/net/torvald/tsvm/TsvmEmulator.java b/tsvm_executable/src/net/torvald/tsvm/TsvmEmulator.java index b40a16d..2a972b7 100644 --- a/tsvm_executable/src/net/torvald/tsvm/TsvmEmulator.java +++ b/tsvm_executable/src/net/torvald/tsvm/TsvmEmulator.java @@ -91,7 +91,13 @@ public class TsvmEmulator { appConfig.setWindowedMode(WIDTH, HEIGHT); - new Lwjgl3Application(new VMEmuExecutableWrapper(VIEWPORT_W, VIEWPORT_H, PANELS_X, PANELS_Y,"assets/"), appConfig); + try { + new Lwjgl3Application(new VMEmuExecutableWrapper(VIEWPORT_W, VIEWPORT_H, PANELS_X, PANELS_Y, "assets/"), appConfig); + } + catch (Throwable e) { + e.printStackTrace(); + if (Gdx.app != null) Gdx.app.exit(); + } } private static void getDefaultDirectory() { diff --git a/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt b/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt index 9570e16..06c83a7 100644 --- a/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt +++ b/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt @@ -194,7 +194,10 @@ class VMEmuExecutable(val windowWidth: Int, val windowHeight: Int, var panelsX: internal fun initVMenv(vm: VM) { val gpu = ReferenceGraphicsAdapter2("./assets", vm) - VMSetupBroker.initVMenv(vm, gpu, vmRunners, coroutineJobs) + VMSetupBroker.initVMenv(vm, gpu, vmRunners, coroutineJobs) { + it.printStackTrace() + VMSetupBroker.killVMenv(vm, vmRunners, coroutineJobs) + } } internal fun killVMenv(vm: VM) {