зеркало из 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):
|
* 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
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче