diff options
author | ngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-12-15 15:26:47 +0000 |
---|---|---|
committer | ngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-12-15 15:26:47 +0000 |
commit | d252c95316ed4c2b7d0ad65efb07468fb26fb589 (patch) | |
tree | b2c04902a634c0c758a9aabc29d2f01fd29d4e40 /lib | |
parent | 6db0b395e9815f6882473636fafd12aaa13b7682 (diff) | |
download | ruby-d252c95316ed4c2b7d0ad65efb07468fb26fb589.tar.gz |
* lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#initialize):
TimeoutMutex should be acquired when accessing @timeout_info.
To avoid deadlock, interrupt() calls are delayed.
Due to the mutex, it is safe to treat ary without ary.dup.
[Bug #11742] [ruby-dev:49387]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53130 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r-- | lib/webrick/utils.rb | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/webrick/utils.rb b/lib/webrick/utils.rb index da6386c96c..dc7ce508ea 100644 --- a/lib/webrick/utils.rb +++ b/lib/webrick/utils.rb @@ -154,20 +154,25 @@ module WEBrick def initialize @timeout_info = Hash.new @watcher = Thread.start{ + to_interrupt = [] while true now = Time.now wakeup = nil - @timeout_info.each {|thread, ary| - next unless ary - ary.dup.each{|info| - time, exception = *info - if time < now - interrupt(thread, info.object_id, exception) - elsif !wakeup || time < wakeup - wakeup = time - end + to_interrupt.clear + TimeoutMutex.synchronize{ + @timeout_info.each {|thread, ary| + next unless ary + ary.each{|info| + time, exception = *info + if time < now + to_interrupt.push [thread, info.object_id, exception] + elsif !wakeup || time < wakeup + wakeup = time + end + } } } + to_interrupt.each {|arg| interrupt(*arg)} if !wakeup sleep elsif (wakeup -= now) > 0 |