From 54c61fb288212f4acee2baa54e35b1ee42a7dce9 Mon Sep 17 00:00:00 2001
From: Sean McArthur <sean.monstar@gmail.com>
Date: Tue, 24 Jul 2012 11:15:52 -0700
Subject: [PATCH] detect if signals can be used and set ENV variable

---
 lib/shutdown.js        |  4 +---
 scripts/run_locally.js | 19 ++++++++++++++++---
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/lib/shutdown.js b/lib/shutdown.js
index 26ef5af42..24a18711e 100644
--- a/lib/shutdown.js
+++ b/lib/shutdown.js
@@ -75,9 +75,7 @@ exports.handleTerminationSignals = function(app, callback) {
     };
   }
 
-  try {
+  if (!process.env.NO_SIGNALS) {
     process.on('SIGINT', endIt('INT')).on('SIGTERM', endIt('TERM')).on('SIGQUIT', endIt('QUIT'));
-  } catch (noSignals) {
-    // Window doesn't support signals
   }
 };
diff --git a/scripts/run_locally.js b/scripts/run_locally.js
index 064212819..d602f22fd 100755
--- a/scripts/run_locally.js
+++ b/scripts/run_locally.js
@@ -78,6 +78,21 @@ if (config.get('env').substr(0,5) === 'test_') {
   }
 }
 
+// Windows can't use signals, so lets figure out if we should use them
+// To force signals, NO_SIGNALS=true.
+// Otherwise, they will be feature-detected.
+var SIGNALS_PROP = 'NO_SIGNALS';
+if (!(SINGALS_PROP in process.env)) {
+  try {
+    function signals_test() {}
+    process.on('SIGINT', signals_test);
+    process.removeListener('SIGINT', signals_test);
+    process.env[SIGNALS_PROP] = false;
+  } catch (noSignals) {
+    process.env[SIGNALS_PROP] = true;
+  }
+}
+
 function runDaemon(daemon, cb) {
   Object.keys(daemonsToRun[daemon]).forEach(function(ek) {
     if (ek === 'path') return; // this blows away the Window PATH
@@ -135,11 +150,9 @@ daemonNames.forEach(function(dn) {
   });
 });
 
-try {
+if (!process.env[SIGNALS_PROP]) {
   process.on('SIGINT', function () {
     console.log('\nSIGINT recieved! trying to shut down gracefully...');
     Object.keys(daemons).forEach(function (k) { daemons[k].kill('SIGINT'); });
   });
-} catch (noSignals) {
-  // Windows doesn't have signal support, so node explodes
 }
-- 
GitLab