Skip to content

Commit 1c59eab

Browse files
committed
Fixes #48513 - buffers terminal onData events
1 parent 988077f commit 1c59eab

File tree

3 files changed

+68
-6
lines changed

3 files changed

+68
-6
lines changed

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

+15-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { DisposableStore, Disposable } from 'vs/base/common/lifecycle';
7-
import { IShellLaunchConfig, ITerminalProcessExtHostProxy, ISpawnExtHostProcessRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY, IAvailableShellsRequest, IDefaultShellAndArgsRequest, IStartExtensionTerminalRequest } from 'vs/workbench/contrib/terminal/common/terminal';
7+
import { IShellLaunchConfig, ITerminalProcessExtHostProxy, ISpawnExtHostProcessRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY, IAvailableShellsRequest, IDefaultShellAndArgsRequest, IStartExtensionTerminalRequest, getTerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/terminal';
88
import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, IShellLaunchConfigDto, TerminalLaunchConfig, ITerminalDimensionsDto } from 'vs/workbench/api/common/extHost.protocol';
99
import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers';
1010
import { URI } from 'vs/base/common/uri';
@@ -337,6 +337,19 @@ class TerminalDataEventTracker extends Disposable {
337337
}
338338

339339
private _registerInstance(instance: ITerminalInstance): void {
340-
this._register(instance.onData(e => this._callback(instance.id, e)));
340+
const bufferer = getTerminalDataBufferer(instance.id, this._callback);
341+
const disposables = [bufferer, instance.onData(bufferer.onData)];
342+
343+
for (const d of disposables) {
344+
this._register(d);
345+
}
346+
347+
this._register(this._terminalService.onInstanceDisposed(i => {
348+
if (i.id === instance.id) {
349+
for (const d of disposables) {
350+
d.dispose();
351+
}
352+
}
353+
}));
341354
}
342355
}

src/vs/workbench/api/common/extHostTerminalService.ts

+13-4
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7+
import { IDisposable } from 'vs/base/common/lifecycle';
78
import { Event, Emitter } from 'vs/base/common/event';
89
import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto, ITerminalDimensionsDto } from 'vs/workbench/api/common/extHost.protocol';
910
import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration';
1011
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
1112
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';
1314
import { timeout } from 'vs/base/common/async';
1415
import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService';
1516

@@ -464,8 +465,12 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ
464465
protected _setupExtHostProcessListeners(id: number, p: ITerminalChildProcess): void {
465466
p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessReady(id, e.pid, e.cwd));
466467
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+
469474
if (p.onProcessOverrideDimensions) {
470475
p.onProcessOverrideDimensions(e => this._proxy.$sendOverrideDimensions(id, e));
471476
}
@@ -503,7 +508,11 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ
503508
return id;
504509
}
505510

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+
507516
// Remove process reference
508517
delete this._terminalProcesses[id];
509518

src/vs/workbench/contrib/terminal/common/terminal.ts

+40
Original file line numberDiff line numberDiff line change
@@ -475,3 +475,43 @@ export const enum TERMINAL_COMMAND_ID {
475475
NAVIGATION_MODE_FOCUS_NEXT = 'workbench.action.terminal.navigationModeFocusNext',
476476
NAVIGATION_MODE_FOCUS_PREVIOUS = 'workbench.action.terminal.navigationModeFocusPrevious'
477477
}
478+
479+
interface TerminalDataBuffer {
480+
timeoutId: any;
481+
data: string[];
482+
}
483+
484+
export interface TerminalDataBufferer extends IDisposable {
485+
onData: (e: string) => void;
486+
}
487+
488+
const terminalBufferMap = new Map<number, TerminalDataBuffer>();
489+
490+
export function getTerminalDataBufferer(id: number, callback: (id: number, data: string) => void): TerminalDataBufferer {
491+
return {
492+
dispose: () => {
493+
const buffer = terminalBufferMap.get(id);
494+
if (buffer) {
495+
clearTimeout(buffer.timeoutId);
496+
terminalBufferMap.delete(id);
497+
}
498+
},
499+
onData: (e: string) => {
500+
let buffer = terminalBufferMap.get(id);
501+
if (buffer) {
502+
buffer.data.push(e);
503+
504+
return;
505+
}
506+
507+
buffer = {
508+
data: [e],
509+
timeoutId: setTimeout(() => {
510+
terminalBufferMap.delete(id);
511+
callback(id, buffer!.data.join(''));
512+
}, 5)
513+
};
514+
terminalBufferMap.set(id, buffer);
515+
}
516+
};
517+
}

0 commit comments

Comments
 (0)