Skip to content

Commit e126fa9

Browse files
committed
Properly clean up R sessions in session manager
1 parent fe8e094 commit e126fa9

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

extensions/positron-r/src/session-manager.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,14 @@ export class RSessionManager implements vscode.Disposable {
6161
throw new Error(`Session ${sessionId} already registered.`);
6262
}
6363
this._sessions.set(sessionId, session);
64-
this._disposables.push(
64+
65+
session.register({
66+
dispose: () => {
67+
this._sessions.delete(sessionId);
68+
}
69+
});
70+
71+
session.register(
6572
session.onDidChangeRuntimeState(async (state) => {
6673
await this.didChangeSessionRuntimeState(session, state);
6774
})

extensions/positron-r/src/session.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ export class RSession implements positron.LanguageRuntimeSession, vscode.Disposa
9999
/** Cache of installed packages and associated version info */
100100
private _packageCache: Map<string, RPackageInstallation> = new Map();
101101

102+
/** Disposables. Disposed of after main resources (LSP, kernel, etc) */
103+
private _disposables: vscode.Disposable[] = [];
104+
102105
/** The current dynamic runtime state */
103106
public dynState: positron.LanguageRuntimeDynState;
104107

@@ -408,6 +411,15 @@ export class RSession implements positron.LanguageRuntimeSession, vscode.Disposa
408411
if (this._kernel) {
409412
await this._kernel.dispose();
410413
}
414+
415+
// LIFO clean up of external resources
416+
while (this._disposables.length > 0) {
417+
this._disposables.pop()?.dispose();
418+
}
419+
}
420+
421+
async register(disposable: vscode.Disposable) {
422+
this._disposables.push(disposable);
411423
}
412424

413425
/**
@@ -882,7 +894,7 @@ export class RSession implements positron.LanguageRuntimeSession, vscode.Disposa
882894
LOGGER.info(`Unknown DAP message: ${message.method}`);
883895

884896
if (message.kind === 'request') {
885-
message.handle(() => { throw new Error(`Unknown request '${message.method}' for DAP comm`) });
897+
message.handle(() => { throw new Error(`Unknown request '${message.method}' for DAP comm`); });
886898
}
887899
}
888900
}

0 commit comments

Comments
 (0)