1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66039 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
eregon 2018-11-27 20:38:20 +00:00
parent 047111584f
commit eae7fbb682

View file

@ -1,26 +1,24 @@
class BlockingMatcher
def matches?(block)
started = false
blocking = true
thread = Thread.new do
started = true
t = Thread.new do
block.call
blocking = false
end
Thread.pass while !started
# Wait until the Thread status is "sleep" (then it's blocking)
# or nil (the Thread finished execution, it did not block)
while status = thread.status and status != "sleep"
Thread.pass
loop do
case t.status
when "sleep" # blocked
t.kill
t.join
return true
when false # terminated normally, so never blocked
t.join
return false
when nil # terminated exceptionally
t.value
else
Thread.pass
end
end
thread.kill
thread.join
blocking
end
def failure_message
@ -33,7 +31,7 @@ class BlockingMatcher
end
module MSpecMatchers
private def block_caller(timeout = 0.1)
private def block_caller
BlockingMatcher.new
end
end