From 5f9c643ae9f0939762a4436ec8de0b5f42284180 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 28 Mar 2013 22:51:47 -0400 Subject: [PATCH] Kill process when task is aborted --- .../fuzzy-finder/lib/load-paths-task.coffee | 5 ++++- src/stdlib/buffered-process.coffee | 21 ++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/packages/fuzzy-finder/lib/load-paths-task.coffee b/src/packages/fuzzy-finder/lib/load-paths-task.coffee index ad3b81ab0..538aac6ba 100644 --- a/src/packages/fuzzy-finder/lib/load-paths-task.coffee +++ b/src/packages/fuzzy-finder/lib/load-paths-task.coffee @@ -30,8 +30,11 @@ class LoadPathsTask stdout = (data) -> paths = paths.concat(_.compact(data.split("\n"))) - new BufferedProcess({command, args, stdout, exit}) + @process = new BufferedProcess({command, args, stdout, exit}) deferred abort: -> @aborted = true + if @process? + @process.kill() + @process = null diff --git a/src/stdlib/buffered-process.coffee b/src/stdlib/buffered-process.coffee index 04fcf3ce9..eda128601 100644 --- a/src/stdlib/buffered-process.coffee +++ b/src/stdlib/buffered-process.coffee @@ -2,32 +2,36 @@ ChildProcess = require 'child_process' module.exports = class BufferedProcess + process: null + killed: false + constructor: ({command, args, options, stdout, stderr, exit}={}) -> - process = ChildProcess.spawn(command, args, options) + @process = ChildProcess.spawn(command, args, options) stdoutClosed = true stderrClosed = true processExited = true exitCode = 0 triggerExitCallback = -> + return if @killed if stdoutClosed and stderrClosed and processExited exit?(exitCode) if stdout stdoutClosed = false - @bufferStream process.stdout, stdout, -> + @bufferStream @process.stdout, stdout, -> stdoutClosed = true triggerExitCallback() if stderr stderrClosed = false - @bufferStream process.stderr, stderr, -> + @bufferStream @process.stderr, stderr, -> stderrClosed = true triggerExitCallback() if exit processExited = false - process.on 'exit', (code) -> + @process.on 'exit', (code) -> exitCode = code processExited = true triggerExitCallback() @@ -36,7 +40,8 @@ class BufferedProcess stream.setEncoding('utf8') buffered = '' - stream.on 'data', (data) -> + stream.on 'data', (data) => + return if @killed buffered += data lastNewlineIndex = buffered.lastIndexOf('\n') if lastNewlineIndex isnt -1 @@ -44,5 +49,11 @@ class BufferedProcess buffered = buffered.substring(lastNewlineIndex + 1) stream.on 'close', => + return if @killed onLines(buffered) if buffered.length > 0 onDone() + + kill: -> + @killed = true + @process.kill() + @process = null