webrick/utils.rb: wakeup immediately

* lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#register):
  notify the handler thread of new timeout registration.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2015-07-14 02:22:51 +00:00
Родитель 8f6fed850a
Коммит 7d909eb218
3 изменённых файлов: 19 добавлений и 12 удалений

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

@ -1,4 +1,7 @@
Tue Jul 14 11:21:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org> Tue Jul 14 11:22:42 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#register):
notify the handler thread of new timeout registration.
* lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#initialize): * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#initialize):
make sleep intervals adaptive than fixed period intervals. make sleep intervals adaptive than fixed period intervals.

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

@ -153,7 +153,7 @@ module WEBrick
# instead of creating the timeout handler directly. # instead of creating the timeout handler directly.
def initialize def initialize
@timeout_info = Hash.new @timeout_info = Hash.new
Thread.start{ @watcher = Thread.start{
while true while true
now = Time.now now = Time.now
wakeup = nil wakeup = nil
@ -194,8 +194,12 @@ module WEBrick
# +exception+:: Exception to raise when timeout elapsed # +exception+:: Exception to raise when timeout elapsed
def register(thread, time, exception) def register(thread, time, exception)
@timeout_info[thread] ||= Array.new @timeout_info[thread] ||= Array.new
@timeout_info[thread] << [time, exception] @timeout_info[thread] << (info = [time, exception])
return @timeout_info[thread].last.object_id begin
@watcher.wakeup
rescue ThreadError
end
return info.object_id
end end
## ##

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

@ -5,7 +5,7 @@ class TestWEBrickUtils < Test::Unit::TestCase
def assert_expired(flag, m) def assert_expired(flag, m)
if m == WEBrick::Utils if m == WEBrick::Utils
handler = WEBrick::Utils::TimeoutHandler.instance handler = WEBrick::Utils::TimeoutHandler.instance
assert_equal(flag, handler.instance_eval{ @timeout_info.empty? }) assert_equal(flag, handler.instance_variable_get(:@timeout_info).empty?)
end end
end end
@ -21,8 +21,8 @@ class TestWEBrickUtils < Test::Unit::TestCase
m = WEBrick::Utils m = WEBrick::Utils
i = 0 i = 0
assert_raise(Timeout::Error){ assert_raise(Timeout::Error){
m.timeout(2){ m.timeout(0.02){
assert_raise(Timeout::Error){ m.timeout(1){ i += 1; sleep } } assert_raise(Timeout::Error){ m.timeout(0.01){ i += 1; sleep } }
assert_expired(false, m) assert_expired(false, m)
i += 1 i += 1
sleep sleep
@ -34,14 +34,14 @@ class TestWEBrickUtils < Test::Unit::TestCase
def test_timeout_default_execption def test_timeout_default_execption
m = WEBrick::Utils m = WEBrick::Utils
assert_raise(Timeout::Error){ m.timeout(0.1){ sleep } } assert_raise(Timeout::Error){ m.timeout(0.01){ sleep } }
assert_expired(true, m) assert_expired(true, m)
end end
def test_timeout_custom_exception def test_timeout_custom_exception
m = WEBrick::Utils m = WEBrick::Utils
ex = EX ex = EX
assert_raise(ex){ m.timeout(0.1, ex){ sleep } } assert_raise(ex){ m.timeout(0.01, ex){ sleep } }
assert_expired(true, m) assert_expired(true, m)
end end
@ -51,7 +51,7 @@ class TestWEBrickUtils < Test::Unit::TestCase
i = 0 i = 0
assert_raise(ex){ assert_raise(ex){
m.timeout(10){ m.timeout(10){
m.timeout(1, ex){ i += 1; sleep } m.timeout(0.01, ex){ i += 1; sleep }
} }
sleep sleep
} }
@ -64,8 +64,8 @@ class TestWEBrickUtils < Test::Unit::TestCase
ex = EX ex = EX
i = 0 i = 0
assert_raise(Timeout::Error){ assert_raise(Timeout::Error){
m.timeout(1){ m.timeout(0.01){
m.timeout(10, ex){ i += 1; sleep } m.timeout(1.0, ex){ i += 1; sleep }
} }
sleep sleep
} }