From b736859e5d476c6a5baf3a6e765ddc22c4d5b4b2 Mon Sep 17 00:00:00 2001 From: seem Date: Fri, 15 Nov 2024 18:12:05 +0200 Subject: [PATCH] fix leaked disposable --- .../runtimeSession/common/runtimeSession.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/services/runtimeSession/common/runtimeSession.ts b/src/vs/workbench/services/runtimeSession/common/runtimeSession.ts index f3e9252f64c..a0b429b3c58 100644 --- a/src/vs/workbench/services/runtimeSession/common/runtimeSession.ts +++ b/src/vs/workbench/services/runtimeSession/common/runtimeSession.ts @@ -363,22 +363,29 @@ export class RuntimeSessionService extends Disposable implements IRuntimeSession session: ILanguageRuntimeSession, exitReason: RuntimeExitReason): Promise { // We wait for `onDidEndSession()` rather than `RuntimeState.Exited`, because the former // generates some Console output that must finish before starting up a new runtime: + let disposable: IDisposable | undefined; const promise = new Promise(resolve => { - const disposable = session.onDidEndSession((exit) => { + disposable = session.onDidEndSession((exit) => { resolve(); - disposable.dispose(); + disposable?.dispose(); }); }); const timeout = new Promise((_, reject) => { setTimeout(() => { + disposable?.dispose(); reject(new Error(`Timed out waiting for runtime ` + `${formatLanguageRuntimeSession(session)} to finish exiting.`)); }, 5000); }); // Ask the runtime to shut down. - await session.shutdown(exitReason); + try { + await session.shutdown(exitReason); + } catch (err) { + disposable?.dispose(); + throw err; + } // Wait for the runtime onDidEndSession to resolve, or for the timeout to expire // (whichever comes first)