зеркало из https://github.com/github/ruby.git
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:
Родитель
8f6fed850a
Коммит
7d909eb218
|
@ -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):
|
||||
make sleep intervals adaptive than fixed period intervals.
|
||||
|
|
|
@ -153,7 +153,7 @@ module WEBrick
|
|||
# instead of creating the timeout handler directly.
|
||||
def initialize
|
||||
@timeout_info = Hash.new
|
||||
Thread.start{
|
||||
@watcher = Thread.start{
|
||||
while true
|
||||
now = Time.now
|
||||
wakeup = nil
|
||||
|
@ -194,8 +194,12 @@ module WEBrick
|
|||
# +exception+:: Exception to raise when timeout elapsed
|
||||
def register(thread, time, exception)
|
||||
@timeout_info[thread] ||= Array.new
|
||||
@timeout_info[thread] << [time, exception]
|
||||
return @timeout_info[thread].last.object_id
|
||||
@timeout_info[thread] << (info = [time, exception])
|
||||
begin
|
||||
@watcher.wakeup
|
||||
rescue ThreadError
|
||||
end
|
||||
return info.object_id
|
||||
end
|
||||
|
||||
##
|
||||
|
|
|
@ -5,7 +5,7 @@ class TestWEBrickUtils < Test::Unit::TestCase
|
|||
def assert_expired(flag, m)
|
||||
if m == WEBrick::Utils
|
||||
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
|
||||
|
||||
|
@ -21,8 +21,8 @@ class TestWEBrickUtils < Test::Unit::TestCase
|
|||
m = WEBrick::Utils
|
||||
i = 0
|
||||
assert_raise(Timeout::Error){
|
||||
m.timeout(2){
|
||||
assert_raise(Timeout::Error){ m.timeout(1){ i += 1; sleep } }
|
||||
m.timeout(0.02){
|
||||
assert_raise(Timeout::Error){ m.timeout(0.01){ i += 1; sleep } }
|
||||
assert_expired(false, m)
|
||||
i += 1
|
||||
sleep
|
||||
|
@ -34,14 +34,14 @@ class TestWEBrickUtils < Test::Unit::TestCase
|
|||
|
||||
def test_timeout_default_execption
|
||||
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)
|
||||
end
|
||||
|
||||
def test_timeout_custom_exception
|
||||
m = WEBrick::Utils
|
||||
ex = EX
|
||||
assert_raise(ex){ m.timeout(0.1, ex){ sleep } }
|
||||
assert_raise(ex){ m.timeout(0.01, ex){ sleep } }
|
||||
assert_expired(true, m)
|
||||
end
|
||||
|
||||
|
@ -51,7 +51,7 @@ class TestWEBrickUtils < Test::Unit::TestCase
|
|||
i = 0
|
||||
assert_raise(ex){
|
||||
m.timeout(10){
|
||||
m.timeout(1, ex){ i += 1; sleep }
|
||||
m.timeout(0.01, ex){ i += 1; sleep }
|
||||
}
|
||||
sleep
|
||||
}
|
||||
|
@ -64,8 +64,8 @@ class TestWEBrickUtils < Test::Unit::TestCase
|
|||
ex = EX
|
||||
i = 0
|
||||
assert_raise(Timeout::Error){
|
||||
m.timeout(1){
|
||||
m.timeout(10, ex){ i += 1; sleep }
|
||||
m.timeout(0.01){
|
||||
m.timeout(1.0, ex){ i += 1; sleep }
|
||||
}
|
||||
sleep
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче