summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2010-10-21 12:27:58 -0700
committerRyan Dahl <ry@tinyclouds.org>2010-10-21 12:28:04 -0700
commitceb5331a64e813f3a982c702fea5dcd2db2e7a29 (patch)
tree16e9a399e193f36c80346551ae5b4e63d0c5cb08
parent33e45bbe46305cdba03c06b6ac6e122c82e86dda (diff)
downloadnode-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.cc3
-rw-r--r--test/simple/test-sigint-infinite-loop.js36
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);
+});
+