|
4 | 4 | *--------------------------------------------------------------------------------------------*/
|
5 | 5 |
|
6 | 6 | import * as vscode from 'vscode';
|
7 |
| -import { IDisposable } from 'vs/base/common/lifecycle'; |
8 | 7 | import { Event, Emitter } from 'vs/base/common/event';
|
9 | 8 | import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto, ITerminalDimensionsDto } from 'vs/workbench/api/common/extHost.protocol';
|
10 | 9 | import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration';
|
11 | 10 | import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
12 | 11 | import { URI, UriComponents } from 'vs/base/common/uri';
|
13 |
| -import { EXT_HOST_CREATION_DELAY, ITerminalChildProcess, ITerminalDimensions, getTerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/terminal'; |
| 12 | +import { EXT_HOST_CREATION_DELAY, ITerminalChildProcess, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; |
14 | 13 | import { timeout } from 'vs/base/common/async';
|
15 | 14 | import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService';
|
| 15 | +import { TerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/terminalDataBuffering'; |
16 | 16 |
|
17 | 17 | export interface IExtHostTerminalService extends ExtHostTerminalServiceShape {
|
18 | 18 |
|
@@ -287,9 +287,13 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ
|
287 | 287 | protected readonly _onDidWriteTerminalData: Emitter<vscode.TerminalDataWriteEvent>;
|
288 | 288 | public get onDidWriteTerminalData(): Event<vscode.TerminalDataWriteEvent> { return this._onDidWriteTerminalData && this._onDidWriteTerminalData.event; }
|
289 | 289 |
|
| 290 | + private readonly _bufferer: TerminalDataBufferer; |
| 291 | + |
290 | 292 | constructor(
|
291 | 293 | @IExtHostRpcService extHostRpc: IExtHostRpcService
|
292 | 294 | ) {
|
| 295 | + this._bufferer = new TerminalDataBufferer(); |
| 296 | + |
293 | 297 | this._proxy = extHostRpc.getProxy(MainContext.MainThreadTerminalService);
|
294 | 298 | this._onDidWriteTerminalData = new Emitter<vscode.TerminalDataWriteEvent>({
|
295 | 299 | onFirstListenerAdd: () => this._proxy.$startSendingDataEvents(),
|
@@ -466,10 +470,9 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ
|
466 | 470 | p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessReady(id, e.pid, e.cwd));
|
467 | 471 | p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title));
|
468 | 472 |
|
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 | + // Buffer data events to reduce the amount of messages going to the renderer |
| 474 | + this._bufferer.startBuffering(id, p.onProcessData, this._proxy.$sendProcessData); |
| 475 | + p.onProcessExit(exitCode => this._onProcessExit(id, exitCode)); |
473 | 476 |
|
474 | 477 | if (p.onProcessOverrideDimensions) {
|
475 | 478 | p.onProcessOverrideDimensions(e => this._proxy.$sendOverrideDimensions(id, e));
|
@@ -508,10 +511,8 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ
|
508 | 511 | return id;
|
509 | 512 | }
|
510 | 513 |
|
511 |
| - private _onProcessExit(id: number, exitCode: number, disposables: IDisposable[]): void { |
512 |
| - for (const d of disposables) { |
513 |
| - d.dispose(); |
514 |
| - } |
| 514 | + private _onProcessExit(id: number, exitCode: number): void { |
| 515 | + this._bufferer.stopBuffering(id); |
515 | 516 |
|
516 | 517 | // Remove process reference
|
517 | 518 | delete this._terminalProcesses[id];
|
|
0 commit comments