From 486fd15c6087c0bc128bc48864bf08543c8c7921 Mon Sep 17 00:00:00 2001 From: vorotamoroz Date: Fri, 22 May 2026 03:46:56 +0000 Subject: [PATCH] fix resouce handling --- src/apps/cli/testdeno/helpers/docker.ts | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/apps/cli/testdeno/helpers/docker.ts b/src/apps/cli/testdeno/helpers/docker.ts index 94d53e7..e9c91ea 100644 --- a/src/apps/cli/testdeno/helpers/docker.ts +++ b/src/apps/cli/testdeno/helpers/docker.ts @@ -18,6 +18,7 @@ const trackedContainers = new Set(); const CLEANUP_SIGNALS: Deno.Signal[] = ["SIGINT", "SIGTERM"]; let signalCleanupHandlersInstalled = false; let signalCleanupInProgress = false; +const signalCleanupHandlers = new Map void>(); // --------------------------------------------------------------------------- // Low-level docker wrapper @@ -217,16 +218,31 @@ function ensureSignalCleanupHandlers(): void { if (signalCleanupHandlersInstalled) return; signalCleanupHandlersInstalled = true; for (const signal of CLEANUP_SIGNALS) { + const listener = () => { + void handleSignalCleanup(signal); + }; try { - Deno.addSignalListener(signal, () => { - void handleSignalCleanup(signal); - }); + Deno.addSignalListener(signal, listener); + signalCleanupHandlers.set(signal, listener); } catch { // Unsupported signal on this platform. } } } +function removeSignalCleanupHandlers(): void { + if (!signalCleanupHandlersInstalled) return; + for (const [signal, listener] of signalCleanupHandlers) { + try { + Deno.removeSignalListener(signal, listener); + } catch { + // Ignore if already removed or unsupported. + } + } + signalCleanupHandlers.clear(); + signalCleanupHandlersInstalled = false; +} + function trackContainer(container: string): void { ensureSignalCleanupHandlers(); trackedContainers.add(container); @@ -234,6 +250,9 @@ function trackContainer(container: string): void { function untrackContainer(container: string): void { trackedContainers.delete(container); + if (trackedContainers.size === 0) { + removeSignalCleanupHandlers(); + } } function sleep(ms: number): Promise {