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:
nobu 2016-01-05 06:09:17 +00:00
Родитель b01c28eeb3
Коммит 8d66627161
14 изменённых файлов: 78 добавлений и 8 удалений

Просмотреть файл

@ -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
##

Просмотреть файл

@ -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