From bae83cc89c595cd8c8abe7bba1f38e23bca5babc Mon Sep 17 00:00:00 2001 From: ngoto Date: Fri, 18 Dec 2015 12:32:53 +0000 Subject: * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler): To prevent potential deadlocks, Queue is used to tell update of @timeout_info instead of sleep and wakeup. [Bug #11742] [ruby-dev:49387] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53192 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/webrick/utils.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'lib/webrick/utils.rb') diff --git a/lib/webrick/utils.rb b/lib/webrick/utils.rb index f7b4412c19..ed0f3da615 100644 --- a/lib/webrick/utils.rb +++ b/lib/webrick/utils.rb @@ -152,6 +152,7 @@ module WEBrick TimeoutMutex.synchronize{ @timeout_info = Hash.new } + @queue = Queue.new @watcher = Thread.start{ to_interrupt = [] while true @@ -173,10 +174,14 @@ module WEBrick } to_interrupt.each {|arg| interrupt(*arg)} if !wakeup - sleep + @queue.pop elsif (wakeup -= now) > 0 - sleep(wakeup) + begin + Timeout.timeout(wakeup) { @queue.pop } + rescue Timeout::Error + end end + @queue.clear end } end @@ -200,10 +205,7 @@ module WEBrick @timeout_info[thread] ||= Array.new @timeout_info[thread] << (info = [time, exception]) } - begin - @watcher.wakeup - rescue ThreadError - end + @queue.push nil return info.object_id end -- cgit v1.2.3