Merge pull request #2517 from reitermarkus/fix-select-blocking

Fix `IO#select` blocking.
This commit is contained in:
Vítor Galvão 2017-04-21 13:43:20 +01:00 committed by GitHub
commit cc7376246e

View File

@ -92,17 +92,25 @@ module Hbc
def each_line_from(sources) def each_line_from(sources)
loop do loop do
readable_sources = IO.select(sources)[0] selected_sources = IO.select(sources, [], [], 10)
readable_sources.delete_if(&:eof?).first(1).each do |source|
break if selected_sources.nil?
readable_sources = selected_sources[0].delete_if(&:eof?)
readable_sources.each do |source|
type = (source == sources[0] ? :stdout : :stderr) type = (source == sources[0] ? :stdout : :stderr)
begin begin
yield(type, source.readline_nonblock || "") yield(type, source.readline_nonblock || "")
rescue IO::WaitReadable, EOFError rescue IO::WaitReadable, EOFError
next next
end end
end end
break if readable_sources.empty? break if readable_sources.empty?
end end
sources.each(&:close_read) sources.each(&:close_read)
end end