From 8d66627161fab5cc65dfb702e3285eb4fef221e8 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 5 Jan 2016 06:09:17 +0000 Subject: leakchecker.rb: remove temporary measure * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#watcher): make watcher thread restartable. * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#terminate): new method to terminate watcher thread. * test/lib/leakchecker.rb (LeakChecker#find_threads): revert r46941. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/webrick/utils.rb | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) (limited to 'lib/webrick') diff --git a/lib/webrick/utils.rb b/lib/webrick/utils.rb index 9c978a2b7b..846829b01f 100644 --- a/lib/webrick/utils.rb +++ b/lib/webrick/utils.rb @@ -124,8 +124,6 @@ module WEBrick class TimeoutHandler include Singleton - class Thread < ::Thread; end - ## # Mutex used to synchronize access across threads TimeoutMutex = Mutex.new # :nodoc: @@ -145,6 +143,10 @@ module WEBrick instance.cancel(Thread.current, id) end + def self.terminate + instance.terminate + end + ## # Creates a new TimeoutHandler. You should use ::register and ::cancel # instead of creating the timeout handler directly. @@ -153,7 +155,12 @@ module WEBrick @timeout_info = Hash.new } @queue = Queue.new - @watcher = Thread.start{ + @watcher = nil + end + + # :nodoc: + private \ + def watch to_interrupt = [] while true now = Time.now @@ -184,8 +191,17 @@ module WEBrick end @queue.clear end - } - end + end + + # :nodoc: + private \ + def watcher + (w = @watcher)&.alive? and return w # usual case + TimeoutMutex.synchronize{ + (w = @watcher)&.alive? and next w # pathological check + @watcher = Thread.start(&method(:watch)) + } + end ## # Interrupts the timeout handler +id+ and raises +exception+ @@ -203,10 +219,10 @@ module WEBrick def register(thread, time, exception) info = nil TimeoutMutex.synchronize{ - @timeout_info[thread] ||= Array.new - @timeout_info[thread] << (info = [time, exception]) + (@timeout_info[thread] ||= []) << (info = [time, exception]) } @queue.push nil + watcher return info.object_id end @@ -224,6 +240,14 @@ module WEBrick return false } end + + ## + def terminate + TimeoutMutex.synchronize{ + @timeout_info.clear + @watcher&.kill&.join + } + end end ## -- cgit v1.2.3