cluster: do not signal children in debug mode
authorFedor Indutny <fedor@indutny.com>
Sat, 4 Oct 2014 14:44:46 +0000 (18:44 +0400)
committerFedor Indutny <fedor@indutny.com>
Wed, 8 Oct 2014 11:36:13 +0000 (15:36 +0400)
Do not send signal to children if they are already in debug mode.
Node.js on Windows does not register signal handler, and thus calling
`process._debugProcess()` will throw an error.

Reviewed-By: Trevor Norris <trevnorris@gmail.com>
PR-URL: https://github.com/joyent/node/pull/8476

lib/cluster.js

index c994f43..6f355d0 100644 (file)
@@ -266,16 +266,34 @@ function masterInit() {
     assert(schedulingPolicy === SCHED_NONE || schedulingPolicy === SCHED_RR,
            'Bad cluster.schedulingPolicy: ' + schedulingPolicy);
 
-    process.on('internalMessage', function(message) {
-      if (message.cmd !== 'NODE_DEBUG_ENABLED') return;
-      var key;
-      for (key in cluster.workers)
-        process._debugProcess(cluster.workers[key].process.pid);
+    var hasDebugArg = process.execArgv.some(function(argv) {
+      return /^(--debug|--debug-brk)(=\d+)?$/.test(argv);
     });
 
     process.nextTick(function() {
       cluster.emit('setup', settings);
     });
+
+    // Send debug signal only if not started in debug mode, this helps a lot
+    // on windows, because RegisterDebugHandler is not called when node starts
+    // with --debug.* arg.
+    if (hasDebugArg)
+      return;
+
+    process.on('internalMessage', function(message) {
+      if (message.cmd !== 'NODE_DEBUG_ENABLED') return;
+      var key;
+      for (key in cluster.workers) {
+        var worker = cluster.workers[key];
+        if (worker.state === 'online') {
+          process._debugProcess(worker.process.pid);
+        } else {
+          worker.once('online', function() {
+            process._debugProcess(this.process.pid);
+          });
+        }
+      }
+    });
   };
 
   function createWorkerProcess(id, env) {