Skip to content

Commit 0ad00ee

Browse files
committed
Merge branch 'tyriar/185393_2' into tyriar/185393_2__ptyhost_marks
2 parents 6344017 + 6d36404 commit 0ad00ee

File tree

18 files changed

+181
-168
lines changed

18 files changed

+181
-168
lines changed

src/vs/platform/terminal/common/terminal.ts

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { ThemeIcon } from 'vs/base/common/themables';
1313
import { ISerializableEnvironmentVariableCollections } from 'vs/platform/terminal/common/environmentVariable';
1414
import { RawContextKey } from 'vs/platform/contextkey/common/contextkey';
1515
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
16+
import { Registry } from 'vs/platform/registry/common/platform';
1617
import type * as performance from 'vs/base/common/performance';
1718

1819
export const terminalTabFocusContextKey = new RawContextKey<boolean>('terminalTabFocusMode', false, true);
@@ -946,6 +947,108 @@ export interface ITerminalCommandSelector {
946947
commandExitResult: 'success' | 'error';
947948
}
948949

950+
export interface ITerminalBackend {
951+
readonly remoteAuthority: string | undefined;
952+
953+
readonly isResponsive: boolean;
954+
readonly whenConnected: Promise<void>;
955+
setConnected(): void;
956+
957+
/**
958+
* Fired when the ptyHost process becomes non-responsive, this should disable stdin for all
959+
* terminals using this pty host connection and mark them as disconnected.
960+
*/
961+
onPtyHostUnresponsive: Event<void>;
962+
/**
963+
* Fired when the ptyHost process becomes responsive after being non-responsive. Allowing
964+
* previously disconnected terminals to reconnect.
965+
*/
966+
onPtyHostResponsive: Event<void>;
967+
/**
968+
* Fired when the ptyHost has been restarted, this is used as a signal for listening terminals
969+
* that its pty has been lost and will remain disconnected.
970+
*/
971+
onPtyHostRestart: Event<void>;
972+
973+
onDidRequestDetach: Event<{ requestId: number; workspaceId: string; instanceId: number }>;
974+
975+
attachToProcess(id: number): Promise<ITerminalChildProcess | undefined>;
976+
attachToRevivedProcess(id: number): Promise<ITerminalChildProcess | undefined>;
977+
listProcesses(): Promise<IProcessDetails[]>;
978+
getDefaultSystemShell(osOverride?: OperatingSystem): Promise<string>;
979+
getProfiles(profiles: unknown, defaultProfile: unknown, includeDetectedProfiles?: boolean): Promise<ITerminalProfile[]>;
980+
getWslPath(original: string, direction: 'unix-to-win' | 'win-to-unix'): Promise<string>;
981+
getEnvironment(): Promise<IProcessEnvironment>;
982+
getShellEnvironment(): Promise<IProcessEnvironment | undefined>;
983+
setTerminalLayoutInfo(layoutInfo?: ITerminalsLayoutInfoById): Promise<void>;
984+
updateTitle(id: number, title: string, titleSource: TitleEventSource): Promise<void>;
985+
updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<void>;
986+
getTerminalLayoutInfo(): Promise<ITerminalsLayoutInfo | undefined>;
987+
getPerformanceMarks(): Promise<performance.PerformanceMark[]>;
988+
reduceConnectionGraceTime(): Promise<void>;
989+
requestDetachInstance(workspaceId: string, instanceId: number): Promise<IProcessDetails | undefined>;
990+
acceptDetachInstanceReply(requestId: number, persistentProcessId?: number): Promise<void>;
991+
persistTerminalState(): Promise<void>;
992+
993+
createProcess(
994+
shellLaunchConfig: IShellLaunchConfig,
995+
cwd: string,
996+
cols: number,
997+
rows: number,
998+
unicodeVersion: '6' | '11',
999+
env: IProcessEnvironment,
1000+
options: ITerminalProcessOptions,
1001+
shouldPersist: boolean
1002+
): Promise<ITerminalChildProcess>;
1003+
1004+
restartPtyHost(): void;
1005+
}
1006+
1007+
export const TerminalExtensions = {
1008+
Backend: 'workbench.contributions.terminal.processBackend'
1009+
};
1010+
1011+
export interface ITerminalBackendRegistry {
1012+
/**
1013+
* Gets all backends in the registry.
1014+
*/
1015+
backends: ReadonlyMap<string, ITerminalBackend>;
1016+
1017+
/**
1018+
* Registers a terminal backend for a remote authority.
1019+
*/
1020+
registerTerminalBackend(backend: ITerminalBackend): void;
1021+
1022+
/**
1023+
* Returns the registered terminal backend for a remote authority.
1024+
*/
1025+
getTerminalBackend(remoteAuthority?: string): ITerminalBackend | undefined;
1026+
}
1027+
1028+
class TerminalBackendRegistry implements ITerminalBackendRegistry {
1029+
private readonly _backends = new Map<string, ITerminalBackend>();
1030+
1031+
get backends(): ReadonlyMap<string, ITerminalBackend> { return this._backends; }
1032+
1033+
registerTerminalBackend(backend: ITerminalBackend): void {
1034+
const key = this._sanitizeRemoteAuthority(backend.remoteAuthority);
1035+
if (this._backends.has(key)) {
1036+
throw new Error(`A terminal backend with remote authority '${key}' was already registered.`);
1037+
}
1038+
this._backends.set(key, backend);
1039+
}
1040+
1041+
getTerminalBackend(remoteAuthority: string | undefined): ITerminalBackend | undefined {
1042+
return this._backends.get(this._sanitizeRemoteAuthority(remoteAuthority));
1043+
}
1044+
1045+
private _sanitizeRemoteAuthority(remoteAuthority: string | undefined) {
1046+
// Normalize the key to lowercase as the authority is case-insensitive
1047+
return remoteAuthority?.toLowerCase() ?? '';
1048+
}
1049+
}
1050+
Registry.add(TerminalExtensions.Backend, new TerminalBackendRegistry());
1051+
9491052
export const ILocalPtyService = createDecorator<ILocalPtyService>('localPtyService');
9501053

9511054
/**

src/vs/workbench/contrib/performance/browser/perfviewEditor.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { ILabelService } from 'vs/platform/label/common/label';
2626
import { isWeb } from 'vs/base/common/platform';
2727
import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
2828
import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal';
29+
import * as perf from 'vs/base/common/performance';
2930

3031
export class PerfviewContrib {
3132

@@ -128,7 +129,7 @@ class PerfModelContentProvider implements ITextModelContentProvider {
128129
md.blank();
129130
this._addExtensionsTable(md);
130131
md.blank();
131-
this._addPerfMarksTable('Terminal Stats', md, this._terminalService.perfMarks);
132+
this._addPerfMarksTable('Terminal Stats', md, this._timerService.getPerformanceMarks().find(e => e[0] === 'renderer')?.[1].filter(e => e.name.startsWith('code/terminal/')));
132133
md.blank();
133134
this._addRawPerfMarks(md);
134135
md.blank();
@@ -224,18 +225,21 @@ class PerfModelContentProvider implements ITextModelContentProvider {
224225
}
225226
}
226227

227-
private _addPerfMarksTable(name: string, md: MarkdownBuilder, marks: readonly PerformanceMark[]): void {
228+
private _addPerfMarksTable(name: string, md: MarkdownBuilder, marks: readonly perf.PerformanceMark[] | undefined): void {
229+
if (!marks) {
230+
return;
231+
}
228232
const table: Array<Array<string | number | undefined>> = [];
229233
let lastStartTime = -1;
230234
let total = 0;
231-
for (const { name, startTime, detail } of marks) {
235+
for (const { name, startTime } of marks) {
232236
const delta = lastStartTime !== -1 ? startTime - lastStartTime : 0;
233237
total += delta;
234-
table.push([name, Math.round(startTime), Math.round(delta), Math.round(total), detail ?? '']);
238+
table.push([name, Math.round(startTime), Math.round(delta), Math.round(total)]);
235239
lastStartTime = startTime;
236240
}
237241
md.heading(2, name);
238-
md.table(['Name', 'Timestamp', 'Delta', 'Total', 'Detail'], table);
242+
md.table(['Name', 'Timestamp', 'Delta', 'Total'], table);
239243
}
240244

241245
private _addRawPerfMarks(md: MarkdownBuilder): void {

src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts

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

6+
import { DeferredPromise } from 'vs/base/common/async';
67
import { Emitter } from 'vs/base/common/event';
78
import { revive } from 'vs/base/common/marshalling';
89
import { PerformanceMark } from 'vs/base/common/performance';
@@ -15,15 +16,15 @@ import { Registry } from 'vs/platform/registry/common/platform';
1516
import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
1617
import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage';
1718
import { ISerializedTerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities';
18-
import { IShellLaunchConfig, IShellLaunchConfigDto, ITerminalChildProcess, ITerminalEnvironment, ITerminalProcessOptions, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ProcessPropertyType, TerminalIcon, TerminalSettingId, TitleEventSource } from 'vs/platform/terminal/common/terminal';
19+
import { IShellLaunchConfig, IShellLaunchConfigDto, ITerminalBackend, ITerminalBackendRegistry, ITerminalChildProcess, ITerminalEnvironment, ITerminalProcessOptions, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ProcessPropertyType, TerminalExtensions, TerminalIcon, TerminalSettingId, TitleEventSource } from 'vs/platform/terminal/common/terminal';
1920
import { IProcessDetails } from 'vs/platform/terminal/common/terminalProcess';
2021
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
2122
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
2223
import { BaseTerminalBackend } from 'vs/workbench/contrib/terminal/browser/baseTerminalBackend';
2324
import { RemotePty } from 'vs/workbench/contrib/terminal/browser/remotePty';
2425
import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal';
2526
import { RemoteTerminalChannelClient, REMOTE_TERMINAL_CHANNEL_NAME } from 'vs/workbench/contrib/terminal/common/remoteTerminalChannel';
26-
import { ICompleteTerminalConfiguration, ITerminalBackend, ITerminalBackendRegistry, ITerminalConfiguration, TerminalExtensions, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal';
27+
import { ICompleteTerminalConfiguration, ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal';
2728
import { TerminalStorageKeys } from 'vs/workbench/contrib/terminal/common/terminalStorageKeys';
2829
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
2930
import { IHistoryService } from 'vs/workbench/services/history/common/history';
@@ -49,6 +50,10 @@ export class RemoteTerminalBackendContribution implements IWorkbenchContribution
4950
class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBackend {
5051
private readonly _ptys: Map<number, RemotePty> = new Map();
5152

53+
private readonly _whenConnected = new DeferredPromise<void>();
54+
get whenConnected(): Promise<void> { return this._whenConnected.p; }
55+
setConnected(): void { this._whenConnected.complete(); }
56+
5257
private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number; workspaceId: string; instanceId: number }>());
5358
readonly onDidRequestDetach = this._onDidRequestDetach.event;
5459
private readonly _onRestoreCommands = this._register(new Emitter<{ id: number; commands: ISerializedTerminalCommand[] }>());

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Copyright (c) Microsoft Corporation. All rights reserved.
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
5+
56
import { IDimension } from 'vs/base/browser/dom';
67
import { Orientation } from 'vs/base/browser/ui/splitview/splitview';
78
import { Color } from 'vs/base/common/color';
@@ -13,15 +14,15 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
1314
import { IKeyMods } from 'vs/platform/quickinput/common/quickInput';
1415
import { IMarkProperties, ITerminalCapabilityStore, ITerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities';
1516
import { IMergedEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable';
16-
import { IExtensionTerminalProfile, IReconnectionProperties, IShellIntegration, IShellLaunchConfig, ITerminalDimensions, ITerminalLaunchError, ITerminalProfile, ITerminalTabLayoutInfoById, TerminalExitReason, TerminalIcon, TerminalLocation, TerminalShellType, TerminalType, TitleEventSource, WaitOnExitValue } from 'vs/platform/terminal/common/terminal';
17+
import { IExtensionTerminalProfile, IReconnectionProperties, IShellIntegration, IShellLaunchConfig, ITerminalBackend, ITerminalDimensions, ITerminalLaunchError, ITerminalProfile, ITerminalTabLayoutInfoById, TerminalExitReason, TerminalIcon, TerminalLocation, TerminalShellType, TerminalType, TitleEventSource, WaitOnExitValue } from 'vs/platform/terminal/common/terminal';
1718
import { IColorTheme } from 'vs/platform/theme/common/themeService';
1819
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
1920
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
2021
import { IEditableData } from 'vs/workbench/common/views';
2122
import { ITerminalStatusList } from 'vs/workbench/contrib/terminal/browser/terminalStatusList';
2223
import { ScrollPosition } from 'vs/workbench/contrib/terminal/browser/xterm/markNavigationAddon';
2324
import { XtermTerminal } from 'vs/workbench/contrib/terminal/browser/xterm/xtermTerminal';
24-
import { IRegisterContributedProfileArgs, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalBackend, ITerminalConfigHelper, ITerminalFont, ITerminalProcessExtHostProxy } from 'vs/workbench/contrib/terminal/common/terminal';
25+
import { IRegisterContributedProfileArgs, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalFont, ITerminalProcessExtHostProxy } from 'vs/workbench/contrib/terminal/common/terminal';
2526
import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn';
2627
import { ISimpleSelectedSuggestion } from 'vs/workbench/services/suggest/browser/simpleSuggestWidget';
2728
import { IMarker, Terminal as RawXtermTerminal } from 'xterm';
@@ -159,7 +160,6 @@ export interface ITerminalService extends ITerminalInstanceHost {
159160
readonly connectionState: TerminalConnectionState;
160161
readonly whenConnected: Promise<void>;
161162
readonly defaultLocation: TerminalLocation;
162-
readonly perfMarks: readonly PerformanceMark[];
163163

164164
onDidChangeActiveGroup: Event<ITerminalGroup | undefined>;
165165
onDidDisposeGroup: Event<ITerminalGroup>;

src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
import { ITerminalInstance, ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal';
77
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
88
import { Disposable } from 'vs/base/common/lifecycle';
9-
import { IShellLaunchConfig, ITerminalProfile, TerminalLocation } from 'vs/platform/terminal/common/terminal';
9+
import { IShellLaunchConfig, ITerminalBackend, ITerminalBackendRegistry, ITerminalProfile, TerminalExtensions, TerminalLocation } from 'vs/platform/terminal/common/terminal';
1010
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1111
import { TerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminalInstance';
1212
import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
1313
import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper';
14-
import { ITerminalBackend, ITerminalBackendRegistry, TerminalExtensions } from 'vs/workbench/contrib/terminal/common/terminal';
1514
import { URI } from 'vs/base/common/uri';
1615
import { Emitter, Event } from 'vs/base/common/event';
1716
import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey';

src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
1919
import { ISerializedCommandDetectionCapability, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities';
2020
import { NaiveCwdDetectionCapability } from 'vs/platform/terminal/common/capabilities/naiveCwdDetectionCapability';
2121
import { TerminalCapabilityStore } from 'vs/platform/terminal/common/capabilities/terminalCapabilityStore';
22-
import { FlowControlConstants, IProcessDataEvent, IProcessProperty, IProcessPropertyMap, IProcessReadyEvent, IReconnectionProperties, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalEnvironment, ITerminalLaunchError, ITerminalProcessOptions, ProcessPropertyType, TerminalSettingId } from 'vs/platform/terminal/common/terminal';
22+
import { FlowControlConstants, IProcessDataEvent, IProcessProperty, IProcessPropertyMap, IProcessReadyEvent, IReconnectionProperties, IShellLaunchConfig, ITerminalBackend, ITerminalChildProcess, ITerminalDimensions, ITerminalEnvironment, ITerminalLaunchError, ITerminalProcessOptions, ProcessPropertyType, TerminalSettingId } from 'vs/platform/terminal/common/terminal';
2323
import { TerminalRecorder } from 'vs/platform/terminal/common/terminalRecorder';
2424
import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
2525
import { EnvironmentVariableInfoChangesActive, EnvironmentVariableInfoStale } from 'vs/workbench/contrib/terminal/browser/environmentVariableInfo';
2626
import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal';
2727
import { IEnvironmentVariableInfo, IEnvironmentVariableService } from 'vs/workbench/contrib/terminal/common/environmentVariable';
2828
import { MergedEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariableCollection';
2929
import { serializeEnvironmentVariableCollections } from 'vs/platform/terminal/common/environmentVariableShared';
30-
import { IBeforeProcessDataEvent, ITerminalBackend, ITerminalConfigHelper, ITerminalProcessManager, ITerminalProfileResolverService, ProcessState } from 'vs/workbench/contrib/terminal/common/terminal';
30+
import { IBeforeProcessDataEvent, ITerminalConfigHelper, ITerminalProcessManager, ITerminalProfileResolverService, ProcessState } from 'vs/workbench/contrib/terminal/common/terminal';
3131
import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment';
3232
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
3333
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';

0 commit comments

Comments
 (0)