Use :pgroup option when starting subprocesses

This makes it easier and faster to kill spawned git processes.
Repetitive `pgrep` command for collecting PIDs is no longer required.
Unfortunately, :pgroup option is not supported on Ruby 1.8 so we can't
remove the old implementation of `killall`.
This commit is contained in:
Junegunn Choi 2015-02-17 11:43:39 +09:00
parent 4a96db8971
commit 308fb9bc94

View File

@ -1003,23 +1003,36 @@ function! s:update_ruby()
%["#{arg.gsub('"', '\"')}"] %["#{arg.gsub('"', '\"')}"]
end end
def killall pid require 'rubygems'
pids = [pid]
unless `which pgrep 2> /dev/null`.empty?
children = pids
until children.empty?
children = children.map { |pid|
`pgrep -P #{pid}`.lines.map { |l| l.chomp }
}.flatten
pids += children
end
end
pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
end
require 'thread' require 'thread'
require 'fileutils' require 'fileutils'
require 'timeout' require 'timeout'
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('1.9')
def popen cmd
IO.popen(cmd, :pgroup => true)
end
def killall pid
Process.kill 'TERM', - pid rescue nil
end
else
def popen cmd
IO.popen(cmd)
end
def killall pid
pids = [pid]
unless `which pgrep 2> /dev/null`.empty?
children = pids
until children.empty?
children = children.map { |pid|
`pgrep -P #{pid}`.lines.map { |l| l.chomp }
}.flatten
pids += children
end
end
pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
end
end
running = true running = true
iswin = VIM::evaluate('s:is_win').to_i == 1 iswin = VIM::evaluate('s:is_win').to_i == 1
pull = VIM::evaluate('s:update.pull').to_i == 1 pull = VIM::evaluate('s:update.pull').to_i == 1
@ -1086,7 +1099,7 @@ function! s:update_ruby()
File.unlink tmp rescue nil File.unlink tmp rescue nil
end end
else else
fd = IO.popen(cmd).extend(PlugStream) fd = popen(cmd).extend(PlugStream)
first_line = true first_line = true
log_prob = 1.0 / nthr log_prob = 1.0 / nthr
while line = Timeout::timeout(timeout) { fd.get_line } while line = Timeout::timeout(timeout) { fd.get_line }