mirror of
https://github.com/nodejs/node.git
synced 2025-05-08 09:31:52 +00:00

- Adds the `breakEvalOnSigint` option to `vm.runIn(This)Context`. This uses a watchdog thread to wait for SIGINT and generally works just like the existing `timeout` option. - Adds a method to the existing timer-based watchdog to check if it stopped regularly or by running into the timeout. This is used to tell a SIGINT abort from a timer-based one. - Adds (internal) `process._{start,stop}SigintWatchdog` methods to start/stop the watchdog thread used by the above option manually. This will be used in the REPL to set up SIGINT handling before entering terminal raw mode, so that there is no time window in which Ctrl+C fully aborts the process. PR-URL: https://github.com/nodejs/node/pull/6635 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
40 lines
957 B
JavaScript
40 lines
957 B
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const vm = require('vm');
|
|
|
|
const spawn = require('child_process').spawn;
|
|
|
|
if (process.platform === 'win32') {
|
|
// No way to send CTRL_C_EVENT to processes from JS right now.
|
|
common.skip('platform not supported');
|
|
return;
|
|
}
|
|
|
|
if (process.argv[2] === 'child') {
|
|
const parent = +process.env.REPL_TEST_PPID;
|
|
assert.ok(parent);
|
|
|
|
assert.throws(() => {
|
|
vm.runInThisContext(`process.kill(${parent}, "SIGUSR2"); while(true) {}`, {
|
|
breakOnSigint: true
|
|
});
|
|
}, /Script execution interrupted/);
|
|
|
|
return;
|
|
}
|
|
|
|
process.env.REPL_TEST_PPID = process.pid;
|
|
const child = spawn(process.execPath, [ __filename, 'child' ], {
|
|
stdio: [null, 'pipe', 'inherit']
|
|
});
|
|
|
|
process.on('SIGUSR2', common.mustCall(() => {
|
|
process.kill(child.pid, 'SIGINT');
|
|
}));
|
|
|
|
child.on('close', function(code, signal) {
|
|
assert.strictEqual(signal, null);
|
|
assert.strictEqual(code, 0);
|
|
});
|