Skip to content

Commit 9d6d60f

Browse files
authored
Fix possible TerminalInstance leak (microsoft#203390)
* Fix possible TerminalInstance leak Fixes microsoft#200400 Two fixes: - Make sure an event is disposed of - In EventMultiplexer, explicitly dispose of all listeners when the multiplexer is disposed * Remove extra import
1 parent 98d5533 commit 9d6d60f

File tree

2 files changed

+9
-6
lines changed

2 files changed

+9
-6
lines changed

src/vs/base/common/event.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,14 +1456,17 @@ export class EventMultiplexer<T> implements IDisposable {
14561456
}
14571457

14581458
private unhook(e: { event: Event<T>; listener: IDisposable | null }): void {
1459-
if (e.listener) {
1460-
e.listener.dispose();
1461-
}
1459+
e.listener?.dispose();
14621460
e.listener = null;
14631461
}
14641462

14651463
dispose(): void {
14661464
this.emitter.dispose();
1465+
1466+
for (const e of this.events) {
1467+
e.listener?.dispose();
1468+
}
1469+
this.events = [];
14671470
}
14681471
}
14691472

src/vs/workbench/api/browser/mainThreadTerminalService.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { DisposableStore, Disposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle';
6+
import { DisposableStore, Disposable, IDisposable, MutableDisposable, combinedDisposable } from 'vs/base/common/lifecycle';
77
import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, TerminalLaunchConfig, ITerminalDimensionsDto, ExtHostTerminalIdentifier, TerminalQuickFix, ITerminalCommandDto } from 'vs/workbench/api/common/extHost.protocol';
88
import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers';
99
import { URI } from 'vs/base/common/uri';
@@ -236,7 +236,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
236236
}
237237

238238
const multiplexer = this._terminalService.createOnInstanceCapabilityEvent(TerminalCapability.CommandDetection, capability => capability.onCommandFinished);
239-
multiplexer.event(e => {
239+
const sub = multiplexer.event(e => {
240240
this._onDidExecuteCommand(e.instance.instanceId, {
241241
commandLine: e.data.command,
242242
// TODO: Convert to URI if possible
@@ -245,7 +245,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
245245
output: e.data.getOutput()
246246
});
247247
});
248-
this._sendCommandEventListener.value = multiplexer;
248+
this._sendCommandEventListener.value = combinedDisposable(multiplexer, sub);
249249
}
250250

251251
public $stopSendingCommandEvents(): void {

0 commit comments

Comments
 (0)