aboutsummaryrefslogtreecommitdiffstats
path: root/lib/webrick
diff options
context:
space:
mode:
authorngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-12-18 12:32:53 +0000
committerngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-12-18 12:32:53 +0000
commit0967c1e3ad0fb8d36e0b4fe4117f8e6faca3e9f0 (patch)
treeae4ca24de4b4a5d5d0554fe5a3995bba86583e6c /lib/webrick
parent9d30ef596c3b6830cbb19bf00dd8072f43c3014d (diff)
downloadruby-0967c1e3ad0fb8d36e0b4fe4117f8e6faca3e9f0.tar.gz
* 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
Diffstat (limited to 'lib/webrick')
-rw-r--r--lib/webrick/utils.rb14
1 files changed, 8 insertions, 6 deletions
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