From 3c88d1690fa6412e4de06c43fb784763e8f5d0a7 Mon Sep 17 00:00:00 2001 From: Phoomparin Mano Date: Mon, 8 Apr 2024 13:59:12 +0700 Subject: [PATCH] feat: cleanup sleep timers --- canvas/src/engine/index.ts | 5 +++++ canvas/src/services/sleep.ts | 9 ++++++++- machine/src/machine/mod.rs | 1 + machine/src/sequencer/mod.rs | 1 + 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/canvas/src/engine/index.ts b/canvas/src/engine/index.ts index ac2e1d6..77ced10 100644 --- a/canvas/src/engine/index.ts +++ b/canvas/src/engine/index.ts @@ -9,6 +9,7 @@ import setup, { import { isBlock as is, isBlock } from "@/blocks" import { midiManager } from "@/services/midi" +import { sleepTimers } from "@/services/sleep" import { syncBlockData, updateNodeData } from "@/store/blocks" import { $clock } from "@/store/clock" import { $nodes } from "@/store/nodes" @@ -185,6 +186,10 @@ export class CanvasEngine { // Reset the watchdog. this.ctx.set_await_watchdog(true) + // Reset pending sleep timers. + sleepTimers.forEach(clearInterval) + sleepTimers.clear() + // Report if our program did not halt properly. if (!this.continuous) this.reportHang() } diff --git a/canvas/src/services/sleep.ts b/canvas/src/services/sleep.ts index 0fcd17c..99f83de 100644 --- a/canvas/src/services/sleep.ts +++ b/canvas/src/services/sleep.ts @@ -2,8 +2,15 @@ import { Effect } from "machine-wasm" import { engine } from "@/engine" +export const sleepTimers = new Set() + export function processSleepEffect(id: number, effect: Effect) { if (effect.type !== "Sleep") return - setTimeout(() => engine.ctx.wake(id), effect.ms) + const timer = setTimeout(() => { + engine.ctx.wake(id) + sleepTimers.delete(timer) + }, effect.ms) + + sleepTimers.add(timer) } diff --git a/machine/src/machine/mod.rs b/machine/src/machine/mod.rs index 1ac903f..2b943e9 100644 --- a/machine/src/machine/mod.rs +++ b/machine/src/machine/mod.rs @@ -100,6 +100,7 @@ impl Machine { self.mem.reset_stacks(); self.expected_receives = 0; self.sleeping = false; + self.remaining_sleep_ticks = 0; } } diff --git a/machine/src/sequencer/mod.rs b/machine/src/sequencer/mod.rs index 3a26c04..cfd7e78 100644 --- a/machine/src/sequencer/mod.rs +++ b/machine/src/sequencer/mod.rs @@ -202,6 +202,7 @@ impl Sequencer { // Reset the machine's sleeping flag. if let Some(machine) = self.get_mut(machine_id) { machine.sleeping = false; + machine.remaining_sleep_ticks = 0; } }