Skip to content

Commit 8af267c

Browse files
authored
Merge pull request microsoft#185754 from microsoft/tyriar/185393_2
Make terminals stats section in perfviewEditor
2 parents c9fd012 + 6d36404 commit 8af267c

File tree

18 files changed

+198
-160
lines changed

18 files changed

+198
-160
lines changed

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

Lines changed: 102 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

1718
export const terminalTabFocusContextKey = new RawContextKey<boolean>('terminalTabFocusMode', false, true);
1819

@@ -944,6 +945,107 @@ export interface ITerminalCommandSelector {
944945
commandExitResult: 'success' | 'error';
945946
}
946947

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

9491051
/**

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

Lines changed: 20 additions & 0 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,6 +129,8 @@ class PerfModelContentProvider implements ITextModelContentProvider {
128129
md.blank();
129130
this._addExtensionsTable(md);
130131
md.blank();
132+
this._addPerfMarksTable('Terminal Stats', md, this._timerService.getPerformanceMarks().find(e => e[0] === 'renderer')?.[1].filter(e => e.name.startsWith('code/terminal/')));
133+
md.blank();
131134
this._addRawPerfMarks(md);
132135
md.blank();
133136
this._addLoaderStats(md, stats);
@@ -222,6 +225,23 @@ class PerfModelContentProvider implements ITextModelContentProvider {
222225
}
223226
}
224227

228+
private _addPerfMarksTable(name: string, md: MarkdownBuilder, marks: readonly perf.PerformanceMark[] | undefined): void {
229+
if (!marks) {
230+
return;
231+
}
232+
const table: Array<Array<string | number | undefined>> = [];
233+
let lastStartTime = -1;
234+
let total = 0;
235+
for (const { name, startTime } of marks) {
236+
const delta = lastStartTime !== -1 ? startTime - lastStartTime : 0;
237+
total += delta;
238+
table.push([name, Math.round(startTime), Math.round(delta), Math.round(total)]);
239+
lastStartTime = startTime;
240+
}
241+
md.heading(2, name);
242+
md.table(['Name', 'Timestamp', 'Delta', 'Total'], table);
243+
}
244+
225245
private _addRawPerfMarks(md: MarkdownBuilder): void {
226246

227247
for (const [source, marks] of this._timerService.getPerformanceMarks()) {

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 { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform';
@@ -14,15 +15,15 @@ import { Registry } from 'vs/platform/registry/common/platform';
1415
import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
1516
import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage';
1617
import { ISerializedTerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities';
17-
import { IShellLaunchConfig, IShellLaunchConfigDto, ITerminalChildProcess, ITerminalEnvironment, ITerminalProcessOptions, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ProcessPropertyType, TerminalIcon, TerminalSettingId, TitleEventSource } from 'vs/platform/terminal/common/terminal';
18+
import { IShellLaunchConfig, IShellLaunchConfigDto, ITerminalBackend, ITerminalBackendRegistry, ITerminalChildProcess, ITerminalEnvironment, ITerminalProcessOptions, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ProcessPropertyType, TerminalExtensions, TerminalIcon, TerminalSettingId, TitleEventSource } from 'vs/platform/terminal/common/terminal';
1819
import { IProcessDetails } from 'vs/platform/terminal/common/terminalProcess';
1920
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
2021
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
2122
import { BaseTerminalBackend } from 'vs/workbench/contrib/terminal/browser/baseTerminalBackend';
2223
import { RemotePty } from 'vs/workbench/contrib/terminal/browser/remotePty';
2324
import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal';
2425
import { RemoteTerminalChannelClient, REMOTE_TERMINAL_CHANNEL_NAME } from 'vs/workbench/contrib/terminal/common/remoteTerminalChannel';
25-
import { ICompleteTerminalConfiguration, ITerminalBackend, ITerminalBackendRegistry, ITerminalConfiguration, TerminalExtensions, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal';
26+
import { ICompleteTerminalConfiguration, ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal';
2627
import { TerminalStorageKeys } from 'vs/workbench/contrib/terminal/common/terminalStorageKeys';
2728
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
2829
import { IHistoryService } from 'vs/workbench/services/history/common/history';
@@ -48,6 +49,10 @@ export class RemoteTerminalBackendContribution implements IWorkbenchContribution
4849
class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBackend {
4950
private readonly _ptys: Map<number, RemotePty> = new Map();
5051

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

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

Lines changed: 3 additions & 2 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';

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)