From 58743e3e82905fe4f34ab096cf89353b083bab5d Mon Sep 17 00:00:00 2001 From: Sebastian Gierlinger Date: Thu, 5 Dec 2013 11:43:41 +0100 Subject: [PATCH] Fix multiple instances bug closes #28 - added stopdone to wait for server to stop - renamed done to startdone - added testsequence which is able to reproduce the bug without my changes --- Gruntfile.js | 5 +++++ tasks/lib/server.js | 23 +++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 05c4eed..6777fc5 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -155,6 +155,11 @@ module.exports = function(grunt) { 'express:custom_output', 'nodeunit:custom_output', 'express:custom_output:stop', 'express:stoppable', 'express:stoppable:stop', 'nodeunit:stoppable', + // Multiple consecutive starts/stops of the same server + 'express:custom_delay', 'nodeunit:custom_delay', 'express:custom_delay:stop', + 'express:custom_delay', 'nodeunit:custom_delay', 'express:custom_delay:stop', + 'express:custom_delay', 'nodeunit:custom_delay', 'express:custom_delay:stop', + // Multiple servers 'express:custom_port', 'express:defaults', 'nodeunit:defaults', 'nodeunit:custom_port', diff --git a/tasks/lib/server.js b/tasks/lib/server.js index 1c3a0d6..e64141d 100644 --- a/tasks/lib/server.js +++ b/tasks/lib/server.js @@ -13,15 +13,16 @@ module.exports = function(grunt, target) { process._servers = {}; } - var backup = null; - var done = null; - var server = process._servers[target]; // Store server between live reloads to close/restart express + var backup = null; + var startdone = null; + var stopdone = null; + var server = process._servers[target]; // Store server between live reloads to close/restart express var finished = function() { - if (done) { - done(); + if (startdone) { + startdone(); - done = null; + startdone = null; } }; @@ -50,7 +51,7 @@ module.exports = function(grunt, target) { grunt.log.writeln('Starting '.cyan + (options.background ? 'background' : 'foreground') + ' Express server'); - done = grunt.task.current.async(); + startdone = grunt.task.current.async(); // Set PORT for new processes process.env.PORT = options.port; @@ -71,7 +72,12 @@ module.exports = function(grunt, target) { args: options.args, env: process.env, fallback: options.fallback - }, finished); + }, function (error, result, code) { + if (stopdone) { + stopdone(); + } + finished(); + }); if (options.delay) { setTimeout(finished, options.delay); @@ -102,6 +108,7 @@ module.exports = function(grunt, target) { if (server && server.kill) { grunt.log.writeln('Stopping'.red + ' Express server'); + stopdone = grunt.task.current.async(); server.kill('SIGTERM'); process.removeAllListeners(); server = process._servers[target] = null;