diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2010-10-21 12:27:58 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2010-10-21 12:28:04 -0700 |
commit | ceb5331a64e813f3a982c702fea5dcd2db2e7a29 (patch) | |
tree | 16e9a399e193f36c80346551ae5b4e63d0c5cb08 | |
parent | 33e45bbe46305cdba03c06b6ac6e122c82e86dda (diff) | |
download | node-new-ceb5331a64e813f3a982c702fea5dcd2db2e7a29.tar.gz |
Force exit on SIGINT but still reset flags on stdio fds
Add test that one can ctrl+c out of a script spinning infinitely.
-rw-r--r-- | src/node.cc | 3 | ||||
-rw-r--r-- | test/simple/test-sigint-infinite-loop.js | 36 |
2 files changed, 38 insertions, 1 deletions
diff --git a/src/node.cc b/src/node.cc index 7cfbe1f460..46ea2492bb 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1776,7 +1776,8 @@ static void AtExit() { static void SignalExit(int signal) { - ev_unloop(EV_DEFAULT_ EVUNLOOP_ALL); + AtExit(); + exit(1); } diff --git a/test/simple/test-sigint-infinite-loop.js b/test/simple/test-sigint-infinite-loop.js new file mode 100644 index 0000000000..3505f4a9a5 --- /dev/null +++ b/test/simple/test-sigint-infinite-loop.js @@ -0,0 +1,36 @@ +// This test is to assert that we can SIGINT a script which loops forever. +// ref: http://groups.google.com/group/nodejs-dev/browse_thread/thread/e20f2f8df0296d3f +var common = require('../common'); +var assert = require('assert'); +var spawn = require('child_process').spawn; + +console.log("start"); + +var c = spawn(process.execPath, ['-e', 'while(true) { console.log("hi"); }']); + +var sentKill = false; +var gotChildExit = true; + +c.stdout.on('data', function (s) { + // Prevent race condition: + // Wait for the first bit of output from the child process + // so that we're sure that it's in the V8 event loop and not + // just in the startup phase of execution. + if (!sentKill) { + c.kill('SIGINT') + console.log("SIGINT infinite-loop.js"); + sentKill = true; + } +}); + +c.on('exit', function (code) { + assert.ok(code !== 0); + console.log("killed infinite-loop.js"); + gotChildExit = true; +}); + +process.on('exit', function () { + assert.ok(sentKill); + assert.ok(gotChildExit); +}); + |