1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00

Merge pull request #398 from grddev/reactor-loop

Reactor loop fixes
This commit is contained in:
Evan Phoenix 2013-11-04 21:16:24 -08:00
commit d6496632fd

View file

@ -18,11 +18,24 @@ module Puma
@sockets = [@ready] @sockets = [@ready]
end end
def run private
def run_internal
sockets = @sockets sockets = @sockets
while true while true
ready = IO.select sockets, nil, nil, @sleep_for begin
ready = IO.select sockets, nil, nil, @sleep_for
rescue IOError => e
if sockets.any? { |socket| socket.closed? }
STDERR.puts "Error in select: #{e.message} (#{e.class})"
STDERR.puts e.backtrace
sockets = sockets.reject { |socket| socket.closed? }
retry
else
raise
end
end
if ready and reads = ready[0] if ready and reads = ready[0]
reads.each do |c| reads.each do |c|
@ -95,23 +108,30 @@ module Puma
end end
end end
end end
end
public
def run
run_internal
ensure ensure
@trigger.close @trigger.close
@ready.close @ready.close
end end
def run_in_thread def run_in_thread
@thread = Thread.new { @thread = Thread.new do
while true begin
begin run_internal
run rescue StandardError => e
break STDERR.puts "Error in reactor loop escaped: #{e.message} (#{e.class})"
rescue StandardError => e STDERR.puts e.backtrace
STDERR.puts "Error in reactor loop escaped: #{e.message} (#{e.class})" retry
puts e.backtrace ensure
end @trigger.close
@ready.close
end end
} end
end end
def calculate_sleep def calculate_sleep