From eaaa6b15e5bd786a66281e2e00cd33962f4ee0cd Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 1 Jun 2015 09:35:41 -0700 Subject: [PATCH] :non-potable_water: Prevent stdout/stderr data listener leaks Old listeners were not cleaned up before new ones were being added causing the following console message: warning: possible EventEmitter memory leak detected. Refs #7033 --- spec/task-spec.coffee | 13 +++++++++++++ src/task.coffee | 11 +++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/spec/task-spec.coffee b/spec/task-spec.coffee index 81a8713ad..bddb59d86 100644 --- a/spec/task-spec.coffee +++ b/spec/task-spec.coffee @@ -57,3 +57,16 @@ describe "Task", -> expect(deprecations.length).toBe 1 expect(deprecations[0].getStacks()[0][1].fileName).toBe handlerPath jasmine.restoreDeprecationsSnapshot() + + it "adds data listeners to standard out and error to report output", -> + task = new Task(require.resolve('./fixtures/task-spec-handler')) + {stdout, stderr} = task.childProcess + + task.start() + task.start() + expect(stdout.listeners('data').length).toBe 1 + expect(stderr.listeners('data').length).toBe 1 + + task.terminate() + expect(stdout.listeners('data').length).toBe 0 + expect(stderr.listeners('data').length).toBe 0 diff --git a/src/task.coffee b/src/task.coffee index d752ea11d..939b71635 100644 --- a/src/task.coffee +++ b/src/task.coffee @@ -100,11 +100,12 @@ class Task @childProcess.removeAllListeners() @childProcess.on 'message', ({event, args}) => @emit(event, args...) if @childProcess? + # Catch the errors that happened before task-bootstrap. - @childProcess.stdout.on 'data', (data) -> - console.log data.toString() - @childProcess.stderr.on 'data', (data) -> - console.error data.toString() + @childProcess.stdout.removeAllListeners() + @childProcess.stdout.on 'data', (data) -> console.log data.toString() + @childProcess.stderr.removeAllListeners() + @childProcess.stderr.on 'data', (data) -> console.error data.toString() # Public: Starts the task. # @@ -152,6 +153,8 @@ class Task return unless @childProcess? @childProcess.removeAllListeners() + @childProcess.stdout.removeAllListeners() + @childProcess.stderr.removeAllListeners() @childProcess.kill() @childProcess = null