From 8144dddb82921905dd17c1016fa9e04b67e4e5f8 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 14 Sep 2024 11:14:17 +0900 Subject: [PATCH] fix: out-of-main-thread VM disposal in VMEmu --- .../src/net/torvald/tsvm/VMEmuExecutable.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt b/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt index c72c3c2..6cdf62e 100644 --- a/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt +++ b/tsvm_executable/src/net/torvald/tsvm/VMEmuExecutable.kt @@ -85,6 +85,8 @@ class VMEmuExecutable(val windowWidth: Int, val windowHeight: Int, var panelsX: var vmRunners = HashMap() // var coroutineJobs = HashMap() // + internal val whatToDoOnVmExceptionQueue = ArrayList<() -> Unit>() + companion object { val APPDATADIR = TsvmEmulator.defaultDir @@ -212,7 +214,7 @@ class VMEmuExecutable(val windowWidth: Int, val windowHeight: Int, var panelsX: val gpu = ReferenceGraphicsAdapter("./assets", vm) VMSetupBroker.initVMenv(vm, profiles[profileName]!!, profileName, gpu, vmRunners, coroutineJobs) { it.printStackTrace() - VMSetupBroker.killVMenv(vm, vmRunners, coroutineJobs) + whatToDoOnVmExceptionQueue.add { VMSetupBroker.killVMenv(vm, vmRunners, coroutineJobs) } } } @@ -269,6 +271,15 @@ class VMEmuExecutable(val windowWidth: Int, val windowHeight: Int, var panelsX: renderGame(dt) watchdogs.forEach { (_, watchdog) -> watchdog.update(dt) } + + + val vmExceptionHandlers = whatToDoOnVmExceptionQueue.toList() + vmExceptionHandlers.forEach { it.invoke() } + synchronized(whatToDoOnVmExceptionQueue) { + vmExceptionHandlers.forEach { + whatToDoOnVmExceptionQueue.remove(it) + } + } } private fun reboot(profileName: String) {