зеркало из https://github.com/github/ruby.git
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
This commit is contained in:
Родитель
b01c28eeb3
Коммит
8d66627161
|
@ -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,6 +191,15 @@ module WEBrick
|
|||
end
|
||||
@queue.clear
|
||||
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
|
||||
|
||||
|
@ -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
|
||||
|
||||
##
|
||||
|
|
|
@ -139,7 +139,7 @@ class LeakChecker
|
|||
|
||||
def find_threads
|
||||
Thread.list.find_all {|t|
|
||||
t != Thread.current && /\AWEBrick::/ !~ t.class.name && t.alive?
|
||||
t != Thread.current && t.alive?
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ module TestNetHTTPUtils
|
|||
if @server
|
||||
@server.shutdown
|
||||
@server_thread.join
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
end
|
||||
@log_tester.call(@log) if @log_tester
|
||||
# resume global state
|
||||
|
|
|
@ -43,6 +43,8 @@ class TestOpenURI < Test::Unit::TestCase
|
|||
}
|
||||
assert_join_threads([client_thread, server_thread2])
|
||||
}
|
||||
ensure
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
end
|
||||
|
||||
def with_env(h)
|
||||
|
|
|
@ -52,6 +52,8 @@ class TestOpenURISSL
|
|||
}
|
||||
assert_join_threads(threads)
|
||||
}
|
||||
ensure
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
end
|
||||
|
||||
def setup
|
||||
|
|
|
@ -924,6 +924,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|||
@ssl_server_thread.kill.join
|
||||
@ssl_server_thread = nil
|
||||
end
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
end
|
||||
|
||||
def normal_server_port
|
||||
|
|
|
@ -7,6 +7,11 @@ require "test/unit"
|
|||
class TestWEBrickCGI < Test::Unit::TestCase
|
||||
CRLF = "\r\n"
|
||||
|
||||
def teardown
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
super
|
||||
end
|
||||
|
||||
def start_cgi_server(log_tester=TestWEBrick::DefaultLogTester, &block)
|
||||
config = {
|
||||
:CGIInterpreter => TestWEBrick::RubyBin,
|
||||
|
|
|
@ -5,6 +5,11 @@ require "webrick"
|
|||
require "stringio"
|
||||
|
||||
class WEBrick::TestFileHandler < Test::Unit::TestCase
|
||||
def teardown
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
super
|
||||
end
|
||||
|
||||
def default_file_handler(filename)
|
||||
klass = WEBrick::HTTPServlet::DefaultFileHandler
|
||||
klass.new(WEBrick::Config::HTTP, filename)
|
||||
|
|
|
@ -7,6 +7,11 @@ require "webrick/httpauth/basicauth"
|
|||
require_relative "utils"
|
||||
|
||||
class TestWEBrickHTTPAuth < Test::Unit::TestCase
|
||||
def teardown
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
super
|
||||
end
|
||||
|
||||
def test_basic_auth
|
||||
log_tester = lambda {|log, access_log|
|
||||
assert_equal(1, log.length)
|
||||
|
|
|
@ -13,6 +13,11 @@ end
|
|||
require File.expand_path("utils.rb", File.dirname(__FILE__))
|
||||
|
||||
class TestWEBrickHTTPProxy < Test::Unit::TestCase
|
||||
def teardown
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
super
|
||||
end
|
||||
|
||||
def test_fake_proxy
|
||||
assert_nil(WEBrick::FakeProxyURI.scheme)
|
||||
assert_nil(WEBrick::FakeProxyURI.host)
|
||||
|
|
|
@ -4,6 +4,11 @@ require "stringio"
|
|||
require "test/unit"
|
||||
|
||||
class TestWEBrickHTTPRequest < Test::Unit::TestCase
|
||||
def teardown
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
super
|
||||
end
|
||||
|
||||
def test_simple_request
|
||||
msg = <<-_end_of_message_
|
||||
GET /
|
||||
|
|
|
@ -12,6 +12,11 @@ class TestWEBrickHTTPServer < Test::Unit::TestCase
|
|||
end
|
||||
NoLog = WEBrick::Log.new(empty_log, WEBrick::BasicLog::WARN)
|
||||
|
||||
def teardown
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
super
|
||||
end
|
||||
|
||||
def test_mount
|
||||
httpd = WEBrick::HTTPServer.new(
|
||||
:Logger => NoLog,
|
||||
|
|
|
@ -3,6 +3,11 @@ require "test/unit"
|
|||
require "webrick/utils"
|
||||
|
||||
class TestWEBrickUtils < Test::Unit::TestCase
|
||||
def teardown
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
super
|
||||
end
|
||||
|
||||
def assert_expired(m)
|
||||
Thread.handle_interrupt(Timeout::Error => :never, EX => :never) do
|
||||
assert_empty(m::TimeoutHandler.instance.instance_variable_get(:@timeout_info))
|
||||
|
|
|
@ -3,6 +3,11 @@ require 'timeout'
|
|||
|
||||
module TestXMLRPC
|
||||
module WEBrick_Testing
|
||||
def teardown
|
||||
WEBrick::Utils::TimeoutHandler.terminate
|
||||
super
|
||||
end
|
||||
|
||||
def start_server(logger, config={})
|
||||
raise "already started" if defined?(@__server) && @__server
|
||||
@__started = false
|
||||
|
|
Загрузка…
Ссылка в новой задаче