Skip to content

Commit 0a4b9f3

Browse files
committed
Add a watchdog mechanism to detect when the extension host JavaScript event loop is unresponsive (microsoft#26445)
1 parent 3007332 commit 0a4b9f3

5 files changed

Lines changed: 21 additions & 0 deletions

File tree

build/gulpfile.vscode.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ function packageTask(platform, arch, opts) {
291291
.pipe(util.cleanNodeModule('oniguruma', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/*.js']))
292292
.pipe(util.cleanNodeModule('windows-mutex', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
293293
.pipe(util.cleanNodeModule('native-keymap', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node']))
294+
.pipe(util.cleanNodeModule('native-watchdog', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
294295
.pipe(util.cleanNodeModule('jschardet', ['dist/**']))
295296
.pipe(util.cleanNodeModule('windows-foreground-love', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
296297
.pipe(util.cleanNodeModule('gc-signals', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js']))

npm-shrinkwrap.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"keytar": "^4.0.3",
3636
"minimist": "1.2.0",
3737
"native-keymap": "1.2.4",
38+
"native-watchdog": "0.1.0",
3839
"node-pty": "0.6.9",
3940
"nsfw": "1.0.16",
4041
"semver": "4.3.6",

src/typings/native-watchdog.d.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
declare module 'native-watchdog' {
7+
8+
export function start(timeout: number): void;
9+
10+
}

src/vs/workbench/node/extensionHostMain.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { DiskSearch } from 'vs/workbench/services/search/node/searchService';
1717
import { RemoteTelemetryService } from 'vs/workbench/api/node/extHostTelemetry';
1818
import { IInitData, IEnvironment, IWorkspaceData, MainContext } from 'vs/workbench/api/node/extHost.protocol';
1919
import * as errors from 'vs/base/common/errors';
20+
import * as watchdog from 'native-watchdog';
2021

2122
const nativeExit = process.exit.bind(process);
2223
process.exit = function () {
@@ -51,6 +52,9 @@ export class ExtensionHostMain {
5152
// Error forwarding
5253
const mainThreadErrors = threadService.get(MainContext.MainThreadErrors);
5354
errors.setUnexpectedErrorHandler(err => mainThreadErrors.onUnexpectedExtHostError(errors.transformErrorForSerialization(err)));
55+
56+
// Configure the watchdog to kill our process if the JS event loop is unresponsive for more than 10s
57+
watchdog.start(10000);
5458
}
5559

5660
public start(): TPromise<void> {

0 commit comments

Comments
 (0)