Skip to content

Commit 3a6e18d

Browse files
authored
Merge pull request microsoft#185777 from microsoft/tyriar/185393_2__ptyhost_marks
Track local and remote pty host perf marks
2 parents ad8d1e0 + 6d791b4 commit 3a6e18d

File tree

8 files changed

+43
-5
lines changed

8 files changed

+43
-5
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { ISerializableEnvironmentVariableCollections } from 'vs/platform/termina
1414
import { RawContextKey } from 'vs/platform/contextkey/common/contextkey';
1515
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
1616
import { Registry } from 'vs/platform/registry/common/platform';
17+
import type * as performance from 'vs/base/common/performance';
1718

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

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

314316
start(id: number): Promise<ITerminalLaunchError | { injectedArgs: string[] } | undefined>;
315317
shutdown(id: number, immediate: boolean): Promise<void>;
@@ -982,6 +984,7 @@ export interface ITerminalBackend {
982984
updateTitle(id: number, title: string, titleSource: TitleEventSource): Promise<void>;
983985
updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<void>;
984986
getTerminalLayoutInfo(): Promise<ITerminalsLayoutInfo | undefined>;
987+
getPerformanceMarks(): Promise<performance.PerformanceMark[]>;
985988
reduceConnectionGraceTime(): Promise<void>;
986989
requestDetachInstance(workspaceId: string, instanceId: number): Promise<IProcessDetails | undefined>;
987990
acceptDetachInstanceReply(requestId: number, persistentProcessId?: number): 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
@@ -6,6 +6,7 @@
66
import { DeferredPromise } from 'vs/base/common/async';
77
import { Emitter } from 'vs/base/common/event';
88
import { revive } from 'vs/base/common/marshalling';
9+
import { PerformanceMark } from 'vs/base/common/performance';
910
import { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform';
1011
import { ICommandService } from 'vs/platform/commands/common/commands';
1112
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
@@ -70,7 +71,7 @@ class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBack
7071
@IConfigurationResolverService configurationResolverService: IConfigurationResolverService,
7172
@IHistoryService private readonly _historyService: IHistoryService,
7273
@IConfigurationService private readonly _configurationService: IConfigurationService,
73-
@IStatusbarService statusBarService: IStatusbarService,
74+
@IStatusbarService statusBarService: IStatusbarService
7475
) {
7576
super(_remoteTerminalChannel, logService, _historyService, configurationResolverService, statusBarService, workspaceContextService);
7677

@@ -343,4 +344,8 @@ class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBack
343344

344345
return this._remoteTerminalChannel.getTerminalLayoutInfo();
345346
}
347+
348+
async getPerformanceMarks(): Promise<PerformanceMark[]> {
349+
return this._remoteTerminalChannel.getPerformanceMarks();
350+
}
346351
}

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

Lines changed: 7 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
import { mark } from 'vs/base/common/performance';
5556

5657
export class TerminalService implements ITerminalService {
@@ -175,7 +176,8 @@ export class TerminalService implements ITerminalService {
175176
@INotificationService private readonly _notificationService: INotificationService,
176177
@IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService,
177178
@ICommandService private readonly _commandService: ICommandService,
178-
@IKeybindingService private readonly _keybindingService: IKeybindingService
179+
@IKeybindingService private readonly _keybindingService: IKeybindingService,
180+
@ITimerService private readonly _timerService: ITimerService
179181
) {
180182
this._configHelper = this._instantiationService.createInstance(TerminalConfigHelper);
181183
// the below avoids having to poll routinely.
@@ -285,10 +287,13 @@ export class TerminalService implements ITerminalService {
285287
} else {
286288
reconnectedPromise = Promise.resolve();
287289
}
288-
reconnectedPromise.then(() => {
290+
reconnectedPromise.then(async () => {
289291
this._setConnected();
290292
mark('code/terminal/didReconnect');
291293
for (const backend of this._terminalInstanceService.getRegisteredBackends()) {
294+
mark('code/terminal/willGetPerformanceMarks');
295+
this._timerService.setPerformanceMarks(backend.remoteAuthority === undefined ? 'localPtyHost' : 'remotePtyHost', await backend.getPerformanceMarks());
296+
mark('code/terminal/didGetPerformanceMarks');
292297
backend.setConnected();
293298
}
294299
this._whenConnected.complete();

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/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';
@@ -219,6 +219,10 @@ class LocalTerminalBackend extends BaseTerminalBackend implements ITerminalBacke
219219
return this._proxy.listProcesses();
220220
}
221221

222+
async getPerformanceMarks(): Promise<PerformanceMark[]> {
223+
return this._proxy.getPerformanceMarks();
224+
}
225+
222226
async reduceConnectionGraceTime(): Promise<void> {
223227
this._proxy.reduceConnectionGraceTime();
224228
}

0 commit comments

Comments
 (0)