From 0a4b9f324a5d8ff2d1adc328abc471c2aa9ff604 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 14 Aug 2017 12:15:16 +0200 Subject: [PATCH] Add a watchdog mechanism to detect when the extension host JavaScript event loop is unresponsive (#26445) --- build/gulpfile.vscode.js | 1 + npm-shrinkwrap.json | 5 +++++ package.json | 1 + src/typings/native-watchdog.d.ts | 10 ++++++++++ src/vs/workbench/node/extensionHostMain.ts | 4 ++++ 5 files changed, 21 insertions(+) create mode 100644 src/typings/native-watchdog.d.ts diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 922e4b4c1b6..6d20888fbd3 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -291,6 +291,7 @@ function packageTask(platform, arch, opts) { .pipe(util.cleanNodeModule('oniguruma', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/*.js'])) .pipe(util.cleanNodeModule('windows-mutex', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('native-keymap', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node'])) + .pipe(util.cleanNodeModule('native-watchdog', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('jschardet', ['dist/**'])) .pipe(util.cleanNodeModule('windows-foreground-love', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('gc-signals', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js'])) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 591caeb1f32..1112f9fcfdb 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -295,6 +295,11 @@ "from": "native-keymap@1.2.4", "resolved": "https://registry.npmjs.org/native-keymap/-/native-keymap-1.2.4.tgz" }, + "native-watchdog": { + "version": "0.1.0", + "from": "native-watchdog@0.1.0", + "resolved": "https://registry.npmjs.org/native-watchdog/-/native-watchdog-0.1.0.tgz" + }, "node-pty": { "version": "0.6.9", "from": "node-pty@0.6.9", diff --git a/package.json b/package.json index 90625bc974f..5c0a1adc7e9 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "keytar": "^4.0.3", "minimist": "1.2.0", "native-keymap": "1.2.4", + "native-watchdog": "0.1.0", "node-pty": "0.6.9", "nsfw": "1.0.16", "semver": "4.3.6", diff --git a/src/typings/native-watchdog.d.ts b/src/typings/native-watchdog.d.ts new file mode 100644 index 00000000000..5ab15e00fbf --- /dev/null +++ b/src/typings/native-watchdog.d.ts @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'native-watchdog' { + + export function start(timeout: number): void; + +} diff --git a/src/vs/workbench/node/extensionHostMain.ts b/src/vs/workbench/node/extensionHostMain.ts index fa79d87f976..070e70b1d70 100644 --- a/src/vs/workbench/node/extensionHostMain.ts +++ b/src/vs/workbench/node/extensionHostMain.ts @@ -17,6 +17,7 @@ import { DiskSearch } from 'vs/workbench/services/search/node/searchService'; import { RemoteTelemetryService } from 'vs/workbench/api/node/extHostTelemetry'; import { IInitData, IEnvironment, IWorkspaceData, MainContext } from 'vs/workbench/api/node/extHost.protocol'; import * as errors from 'vs/base/common/errors'; +import * as watchdog from 'native-watchdog'; const nativeExit = process.exit.bind(process); process.exit = function () { @@ -51,6 +52,9 @@ export class ExtensionHostMain { // Error forwarding const mainThreadErrors = threadService.get(MainContext.MainThreadErrors); errors.setUnexpectedErrorHandler(err => mainThreadErrors.onUnexpectedExtHostError(errors.transformErrorForSerialization(err))); + + // Configure the watchdog to kill our process if the JS event loop is unresponsive for more than 10s + watchdog.start(10000); } public start(): TPromise { -- GitLab