From 1420060f8208c8adc702d78f17e2884031234efa Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 3 Sep 2018 14:07:43 +0200 Subject: [PATCH] correct handshake to end profiling, related to #55675 --- src/vs/code/node/cli.ts | 5 ++- .../electron-browser/startupProfiler.ts | 36 ++++++++++++------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index 9316cc507d7..a78baf3eb76 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -280,7 +280,7 @@ export async function main(argv: string[]): Promise { // wait for the renderer to delete the // marker file - whenDeleted(filenamePrefix); + await whenDeleted(filenamePrefix); let profileMain = await main.stop(); let profileRenderer = await renderer.stop(); @@ -303,6 +303,9 @@ export async function main(argv: string[]): Promise { await profiler.writeProfile(profileRenderer, `${filenamePrefix}-renderer.cpuprofile${suffix}`); await profiler.writeProfile(profileExtHost, `${filenamePrefix}-exthost.cpuprofile${suffix}`); + // re-create the marker file to signal that profiling is done + fs.writeFileSync(filenamePrefix, ''); + } catch (e) { console.error('Failed to profile startup. Make sure to quit Code first.'); } diff --git a/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts b/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts index 09fab3522c3..545068b434e 100644 --- a/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts +++ b/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts @@ -5,22 +5,20 @@ 'use strict'; +import { dirname, join } from 'path'; +import { basename } from 'vs/base/common/paths'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { del, exists, readdir, readFile } from 'vs/base/node/pfs'; +import { localize } from 'vs/nls'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { IWindowsService } from 'vs/platform/windows/common/windows'; -import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions } from 'vs/workbench/common/contributions'; import { Registry } from 'vs/platform/registry/common/platform'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { join, dirname } from 'path'; -import { localize } from 'vs/nls'; -import { readdir, del, readFile } from 'vs/base/node/pfs'; -import { basename } from 'vs/base/common/paths'; -import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { timeout } from 'vs/base/common/async'; +import { IWindowsService } from 'vs/platform/windows/common/windows'; +import { Extensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { ReportPerformanceIssueAction } from 'vs/workbench/parts/performance/electron-browser/actions'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; class StartupProfiler implements IWorkbenchContribution { @@ -53,8 +51,20 @@ class StartupProfiler implements IWorkbenchContribution { const removeArgs: string[] = ['--prof-startup']; const markerFile = readFile(profileFilenamePrefix).then(value => removeArgs.push(...value.toString().split('|'))) - .then(() => del(profileFilenamePrefix)) - .then(() => timeout(1000)); + .then(() => del(profileFilenamePrefix)) // (1) delete the file to tell the main process to stop profiling + .then(() => new Promise(resolve => { // (2) wait for main that recreates the fail to signal profiling has stopped + const check = () => { + exists(profileFilenamePrefix).then(exists => { + if (exists) { + resolve(); + } else { + setTimeout(check, 500); + } + }); + }; + check(); + })) + .then(() => del(profileFilenamePrefix)); // (3) finally delete the file again markerFile.then(() => { return readdir(dir).then(files => files.filter(value => value.indexOf(prefix) === 0)); -- GitLab