From aceea1472abb012f64d2d5c10a747d79cb27e353 Mon Sep 17 00:00:00 2001 From: Pavel Forkert Date: Mon, 7 Jan 2013 02:30:56 +0200 Subject: [PATCH] Fix #299 and #260 Some processes close their output channels and IO.select keeps returning them as "readable", while IO#gets returns nil on them, thus spending a lot of CPU looping through the same reader continuously --- lib/foreman/engine.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/foreman/engine.rb b/lib/foreman/engine.rb index 4d0fefa0..8fc6e96b 100644 --- a/lib/foreman/engine.rb +++ b/lib/foreman/engine.rb @@ -275,8 +275,12 @@ def watch_for_output loop do io = IO.select(@readers.values, nil, nil, 30) (io.nil? ? [] : io.first).each do |reader| - data = reader.gets - output_with_mutex name_for(@readers.invert[reader]), data + if reader.eof? + @readers.delete_if { |key, value| value == reader } + else + data = reader.gets + output_with_mutex name_for(@readers.invert[reader]), data + end end end rescue Exception => ex