From 62d967bce03a07818e55d69a44d2c848e80024a2 Mon Sep 17 00:00:00 2001 From: Joey Mezzacappa <20446836+jmezzacappa@users.noreply.github.com> Date: Mon, 15 Aug 2022 16:09:45 -0400 Subject: [PATCH] Wait for emulation to stop when destroying (#721) In some environments, the "emulator-stopped" event did not always fire when calling the `destroy()` method. This waits for emulation to finish stopping before continuing with the rest of the destructor. When stopping the emulator with `.stop()`, the `v86` instance's state would follow these transitions: 1. Before calling `.stop()`: ```js { running: true, stopped: false } ``` 2. Immediately after calling `.stop()`: ```js { running: true, stopped: true } ``` 3. After the emulator has finished stopping: ```js { running: false, stopped: false } ``` It was not immediately obvious how properties named `running` and `stopped` could ever have the same values. This commit renames `stopped` to `stopping` so it is slightly easier to understand while debugging. --- src/browser/starter.js | 18 +++++++++++++++--- src/main.js | 10 +++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/browser/starter.js b/src/browser/starter.js index 43266088..5e1f4209 100644 --- a/src/browser/starter.js +++ b/src/browser/starter.js @@ -698,16 +698,28 @@ V86Starter.prototype.run = async function() */ V86Starter.prototype.stop = async function() { - this.bus.send("cpu-stop"); + if(!this.cpu_is_running) + { + return; + } + + await new Promise(resolve => { + const listener = () => { + this.remove_listener("emulator-stopped", listener); + resolve(); + }; + this.add_listener("emulator-stopped", listener); + this.bus.send("cpu-stop"); + }); }; /** * @ignore * @export */ -V86Starter.prototype.destroy = function() +V86Starter.prototype.destroy = async function() { - this.stop(); + await this.stop(); this.v86.destroy(); this.keyboard_adapter && this.keyboard_adapter.destroy(); diff --git a/src/main.js b/src/main.js index d98d9b56..d8af2103 100644 --- a/src/main.js +++ b/src/main.js @@ -10,7 +10,7 @@ function v86(bus, wasm) this.running = false; /** @type {boolean} */ - this.stopped = false; + this.stopping = false; this.tick_counter = 0; this.worker = null; @@ -29,7 +29,7 @@ function v86(bus, wasm) v86.prototype.run = function() { - this.stopped = false; + this.stopping = false; if(!this.running) { @@ -42,9 +42,9 @@ v86.prototype.run = function() v86.prototype.do_tick = function() { - if(this.stopped || !this.running) + if(this.stopping || !this.running) { - this.stopped = this.running = false; + this.stopping = this.running = false; this.bus.send("emulator-stopped"); return; } @@ -74,7 +74,7 @@ v86.prototype.stop = function() { if(this.running) { - this.stopped = true; + this.stopping = true; } };