From d6a93605a8747d846afb39b0cb6c2bfe72e655cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 30 Jan 2022 15:10:21 +0100 Subject: [PATCH] Fix devices not being released when computer is destroyed while running. --- .../oc2/common/vm/AbstractVirtualMachine.java | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java b/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java index 584b3fc9..38da133b 100644 --- a/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java +++ b/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java @@ -163,16 +163,7 @@ public abstract class AbstractVirtualMachine implements VirtualMachine { @Override public void stop() { - switch (runState) { - case LOADING_DEVICES -> setRunState(VMRunState.STOPPED); - case RUNNING -> stopRunnerAndReset(); - } - } - - private void joinWorkerThread() { - if (runner != null) { - runner.join(); - } + stopRunnerAndReset(); } public void pauseAndReload() { @@ -190,19 +181,6 @@ public abstract class AbstractVirtualMachine implements VirtualMachine { state.rpcAdapter.resume(busController, didDevicesChange); } - protected void stopRunnerAndReset() { - joinWorkerThread(); - setRunState(VMRunState.STOPPED); - - state.board.setRunning(false); - state.board.reset(); - state.rpcAdapter.reset(); - state.rpcAdapter.disposeDevices(); - state.vmAdapter.disposeDevices(); - - runner = null; - } - public void tick() { busController.scan(); setBusState(busController.getState()); @@ -284,8 +262,27 @@ public abstract class AbstractVirtualMachine implements VirtualMachine { setBootError(message); } + protected void stopRunnerAndReset() { + joinWorkerThread(); + setRunState(VMRunState.STOPPED); + + state.board.setRunning(false); + state.board.reset(); + state.rpcAdapter.reset(); + state.rpcAdapter.disposeDevices(); + state.vmAdapter.disposeDevices(); + + runner = null; + } + /////////////////////////////////////////////////////////////////// + private void joinWorkerThread() { + if (runner != null) { + runner.join(); + } + } + private void load() { if (loadDevicesDelay > 0) { loadDevicesDelay--;