|
4 | 4 | *--------------------------------------------------------------------------------------------*/
|
5 | 5 |
|
6 | 6 | import * as vscode from 'vscode';
|
| 7 | +import { IDisposable } from 'vs/base/common/lifecycle'; |
7 | 8 | import { Event, Emitter } from 'vs/base/common/event';
|
8 | 9 | import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto, ITerminalDimensionsDto } from 'vs/workbench/api/common/extHost.protocol';
|
9 | 10 | import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration';
|
10 | 11 | import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
11 | 12 | import { URI, UriComponents } from 'vs/base/common/uri';
|
12 |
| -import { EXT_HOST_CREATION_DELAY, ITerminalChildProcess, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; |
| 13 | +import { EXT_HOST_CREATION_DELAY, ITerminalChildProcess, ITerminalDimensions, getTerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/terminal'; |
13 | 14 | import { timeout } from 'vs/base/common/async';
|
14 | 15 | import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService';
|
15 | 16 |
|
@@ -464,8 +465,12 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ
|
464 | 465 | protected _setupExtHostProcessListeners(id: number, p: ITerminalChildProcess): void {
|
465 | 466 | p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessReady(id, e.pid, e.cwd));
|
466 | 467 | p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title));
|
467 |
| - p.onProcessData(data => this._proxy.$sendProcessData(id, data)); |
468 |
| - p.onProcessExit(exitCode => this._onProcessExit(id, exitCode)); |
| 468 | + |
| 469 | + const bufferer = getTerminalDataBufferer(id, this._proxy.$sendProcessData); |
| 470 | + const disposables = [bufferer, p.onProcessData(bufferer.onData)]; |
| 471 | + |
| 472 | + p.onProcessExit(exitCode => this._onProcessExit(id, exitCode, disposables)); |
| 473 | + |
469 | 474 | if (p.onProcessOverrideDimensions) {
|
470 | 475 | p.onProcessOverrideDimensions(e => this._proxy.$sendOverrideDimensions(id, e));
|
471 | 476 | }
|
@@ -503,7 +508,11 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ
|
503 | 508 | return id;
|
504 | 509 | }
|
505 | 510 |
|
506 |
| - private _onProcessExit(id: number, exitCode: number): void { |
| 511 | + private _onProcessExit(id: number, exitCode: number, disposables: IDisposable[]): void { |
| 512 | + for (const d of disposables) { |
| 513 | + d.dispose(); |
| 514 | + } |
| 515 | + |
507 | 516 | // Remove process reference
|
508 | 517 | delete this._terminalProcesses[id];
|
509 | 518 |
|
|
0 commit comments