Skip to content

Commit 6344017

Browse files
committed
Track perf marks on pty hosts
Part of microsoft#185393
1 parent 3dc84a7 commit 6344017

File tree

9 files changed

+46
-5
lines changed

9 files changed

+46
-5
lines changed

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

Lines changed: 2 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 type * as performance from 'vs/base/common/performance';
1617

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

@@ -309,6 +310,7 @@ export interface IPtyService extends IPtyHostController {
309310
* Lists all orphaned processes, ie. those without a connected frontend.
310311
*/
311312
listProcesses(): Promise<IProcessDetails[]>;
313+
getPerformanceMarks(): Promise<performance.PerformanceMark[]>;
312314

313315
start(id: number): Promise<ITerminalLaunchError | { injectedArgs: string[] } | undefined>;
314316
shutdown(id: number, immediate: boolean): Promise<void>;

src/vs/platform/terminal/node/ptyHostService.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { registerTerminalPlatformConfiguration } from 'vs/platform/terminal/comm
1818
import { IGetTerminalLayoutInfoArgs, IProcessDetails, ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess';
1919
import { IPtyHostConnection, IPtyHostStarter } from 'vs/platform/terminal/node/ptyHost';
2020
import { detectAvailableProfiles } from 'vs/platform/terminal/node/terminalProfiles';
21+
import * as performance from 'vs/base/common/performance';
2122

2223
enum Constants {
2324
MaxRestarts = 5
@@ -229,6 +230,9 @@ export class PtyHostService extends Disposable implements IPtyService {
229230
listProcesses(): Promise<IProcessDetails[]> {
230231
return this._proxy.listProcesses();
231232
}
233+
getPerformanceMarks(): Promise<performance.PerformanceMark[]> {
234+
return this._proxy.getPerformanceMarks();
235+
}
232236
reduceConnectionGraceTime(): Promise<void> {
233237
return this._proxy.reduceConnectionGraceTime();
234238
}

src/vs/platform/terminal/node/ptyService.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { IPtyHostProcessReplayEvent } from 'vs/platform/terminal/common/capabili
3131
import { IProductService } from 'vs/platform/product/common/productService';
3232
import { join } from 'path';
3333
import { memoize } from 'vs/base/common/decorators';
34+
import * as performance from 'vs/base/common/performance';
3435

3536
export function traceRpc(_target: any, key: string, descriptor: any) {
3637
if (typeof descriptor.value !== 'function') {
@@ -344,6 +345,11 @@ export class PtyService extends Disposable implements IPtyService {
344345
return allTerminals.filter(entry => entry.isOrphan);
345346
}
346347

348+
@traceRpc
349+
async getPerformanceMarks(): Promise<performance.PerformanceMark[]> {
350+
return performance.getMarks();
351+
}
352+
347353
@traceRpc
348354
async start(id: number): Promise<ITerminalLaunchError | { injectedArgs: string[] } | undefined> {
349355
const pty = this._ptys.get(id);
@@ -495,13 +501,16 @@ export class PtyService extends Disposable implements IPtyService {
495501

496502
@traceRpc
497503
async getTerminalLayoutInfo(args: IGetTerminalLayoutInfoArgs): Promise<ITerminalsLayoutInfo | undefined> {
504+
performance.mark('code/willGetTerminalLayoutInfo');
498505
const layout = this._workspaceLayoutInfos.get(args.workspaceId);
499506
if (layout) {
500507
const expandedTabs = await Promise.all(layout.tabs.map(async tab => this._expandTerminalTab(tab)));
501508
const tabs = expandedTabs.filter(t => t.terminals.length > 0);
502509
this._logService.trace('PtyService.getTerminalLayoutInfo result', tabs);
510+
performance.mark('code/didGetTerminalLayoutInfo');
503511
return { tabs };
504512
}
513+
performance.mark('code/didGetTerminalLayoutInfo');
505514
return undefined;
506515
}
507516

@@ -537,10 +546,11 @@ export class PtyService extends Disposable implements IPtyService {
537546
}
538547

539548
private async _buildProcessDetails(id: number, persistentProcess: PersistentTerminalProcess, wasRevived: boolean = false): Promise<IProcessDetails> {
549+
performance.mark(`code/willBuildProcessDetails/${id}`);
540550
// If the process was just revived, don't do the orphan check as it will
541551
// take some time
542552
const [cwd, isOrphan] = await Promise.all([persistentProcess.getCwd(), wasRevived ? true : persistentProcess.isOrphaned()]);
543-
return {
553+
const result = {
544554
id,
545555
title: persistentProcess.title,
546556
titleSource: persistentProcess.titleSource,
@@ -561,6 +571,8 @@ export class PtyService extends Disposable implements IPtyService {
561571
hasChildProcesses: persistentProcess.hasChildProcesses,
562572
shellIntegrationNonce: persistentProcess.processLaunchOptions.options.shellIntegration.nonce
563573
};
574+
performance.mark(`code/didBuildProcessDetails/${id}`);
575+
return result;
564576
}
565577

566578
private _throwIfNoPty(id: number): PersistentTerminalProcess {

src/vs/server/node/remoteTerminalChannel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ export class RemoteTerminalChannel extends Disposable implements IServerChannel<
117117
case '$detachFromProcess': return this._ptyService.detachFromProcess.apply(this._ptyService, args);
118118

119119
case '$listProcesses': return this._ptyService.listProcesses.apply(this._ptyService, args);
120+
case '$getPerformanceMarks': return this._ptyService.getPerformanceMarks.apply(this._ptyService, args);
120121
case '$orphanQuestionReply': return this._ptyService.orphanQuestionReply.apply(this._ptyService, args);
121122
case '$acceptPtyHostResolvedVariables': return this._ptyService.acceptPtyHostResolvedVariables?.apply(this._ptyService, args);
122123

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import { Emitter } from 'vs/base/common/event';
77
import { revive } from 'vs/base/common/marshalling';
8+
import { PerformanceMark } from 'vs/base/common/performance';
89
import { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform';
910
import { ICommandService } from 'vs/platform/commands/common/commands';
1011
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
@@ -65,7 +66,7 @@ class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBack
6566
@IConfigurationResolverService configurationResolverService: IConfigurationResolverService,
6667
@IHistoryService private readonly _historyService: IHistoryService,
6768
@IConfigurationService private readonly _configurationService: IConfigurationService,
68-
@IStatusbarService statusBarService: IStatusbarService,
69+
@IStatusbarService statusBarService: IStatusbarService
6970
) {
7071
super(_remoteTerminalChannel, logService, _historyService, configurationResolverService, statusBarService, workspaceContextService);
7172

@@ -338,4 +339,8 @@ class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBack
338339

339340
return this._remoteTerminalChannel.getTerminalLayoutInfo();
340341
}
342+
343+
async getPerformanceMarks(): Promise<PerformanceMark[]> {
344+
return this._remoteTerminalChannel.getPerformanceMarks();
345+
}
341346
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import { XtermTerminal } from 'vs/workbench/contrib/terminal/browser/xterm/xterm
5151
import { TerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminalInstance';
5252
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
5353
import { TerminalCapabilityStore } from 'vs/platform/terminal/common/capabilities/terminalCapabilityStore';
54+
import { ITimerService } from 'vs/workbench/services/timer/browser/timerService';
5455

5556
export class TerminalService implements ITerminalService {
5657
declare _serviceBrand: undefined;
@@ -174,7 +175,8 @@ export class TerminalService implements ITerminalService {
174175
@INotificationService private readonly _notificationService: INotificationService,
175176
@IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService,
176177
@ICommandService private readonly _commandService: ICommandService,
177-
@IKeybindingService private readonly _keybindingService: IKeybindingService
178+
@IKeybindingService private readonly _keybindingService: IKeybindingService,
179+
@ITimerService private readonly _timerService: ITimerService
178180
) {
179181
this._configHelper = this._instantiationService.createInstance(TerminalConfigHelper);
180182
// the below avoids having to poll routinely.
@@ -290,9 +292,14 @@ export class TerminalService implements ITerminalService {
290292
} else {
291293
reconnectedPromise = Promise.resolve();
292294
}
293-
reconnectedPromise.then(() => {
295+
reconnectedPromise.then(async () => {
294296
this._setConnected();
295297
this._mark('terminal/didReconnect');
298+
if (isPersistentRemote || enableTerminalReconnection) {
299+
this._mark('terminal/willGetPerformanceMarks');
300+
this._timerService.setPerformanceMarks(isPersistentRemote ? 'remotePtyHost' : 'localPtyHost', await this._primaryBackend!.getPerformanceMarks());
301+
this._mark('terminal/didGetPerformanceMarks');
302+
}
296303
this._whenConnected.complete();
297304
});
298305

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform';
2424
import { ICompleteTerminalConfiguration } from 'vs/workbench/contrib/terminal/common/terminal';
2525
import { IPtyHostProcessReplayEvent } from 'vs/platform/terminal/common/capabilities/capabilities';
2626
import { ISerializableEnvironmentDescriptionMap as ISerializableEnvironmentDescriptionMap, ISerializableEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable';
27+
import type * as performance from 'vs/base/common/performance';
2728

2829
export const REMOTE_TERMINAL_CHANNEL_NAME = 'remoteterminal';
2930

@@ -202,6 +203,9 @@ export class RemoteTerminalChannelClient implements IPtyHostController {
202203
listProcesses(): Promise<IProcessDetails[]> {
203204
return this._channel.call('$listProcesses');
204205
}
206+
getPerformanceMarks(): Promise<performance.PerformanceMark[]> {
207+
return this._channel.call('$getPerformanceMarks');
208+
}
205209
reduceConnectionGraceTime(): Promise<void> {
206210
return this._channel.call('$reduceConnectionGraceTime');
207211
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { ThemeIcon } from 'vs/base/common/themables';
1818
import { IProcessDetails } from 'vs/platform/terminal/common/terminalProcess';
1919
import Severity from 'vs/base/common/severity';
2020
import { IMergedEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable';
21+
import type * as performance from 'vs/base/common/performance';
2122

2223
export const TERMINAL_VIEW_ID = 'terminal';
2324

@@ -132,6 +133,7 @@ export interface ITerminalBackend {
132133
updateTitle(id: number, title: string, titleSource: TitleEventSource): Promise<void>;
133134
updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<void>;
134135
getTerminalLayoutInfo(): Promise<ITerminalsLayoutInfo | undefined>;
136+
getPerformanceMarks(): Promise<performance.PerformanceMark[]>;
135137
reduceConnectionGraceTime(): Promise<void>;
136138
requestDetachInstance(workspaceId: string, instanceId: number): Promise<IProcessDetails | undefined>;
137139
acceptDetachInstanceReply(requestId: number, persistentProcessId?: number): Promise<void>;

src/vs/workbench/contrib/terminal/electron-sandbox/localTerminalBackend.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/enviro
3232
import { Client as MessagePortClient } from 'vs/base/parts/ipc/common/ipc.mp';
3333
import { acquirePort } from 'vs/base/parts/ipc/electron-sandbox/ipc.mp';
3434
import { getDelayedChannel, ProxyChannel } from 'vs/base/parts/ipc/common/ipc';
35-
import { mark } from 'vs/base/common/performance';
35+
import { mark, PerformanceMark } from 'vs/base/common/performance';
3636
import { ILifecycleService, LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle';
3737
import { DeferredPromise } from 'vs/base/common/async';
3838
import { IStatusbarService } from 'vs/workbench/services/statusbar/browser/statusbar';
@@ -216,6 +216,10 @@ class LocalTerminalBackend extends BaseTerminalBackend implements ITerminalBacke
216216
return this._proxy.listProcesses();
217217
}
218218

219+
async getPerformanceMarks(): Promise<PerformanceMark[]> {
220+
return this._proxy.getPerformanceMarks();
221+
}
222+
219223
async reduceConnectionGraceTime(): Promise<void> {
220224
this._proxy.reduceConnectionGraceTime();
221225
}

0 commit comments

Comments
 (0)