mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* Merge YARV
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
3e7566d8fb
commit
a3e1b1ce7e
233 changed files with 46004 additions and 13653 deletions
209
yarvtest/test_thread.rb
Normal file
209
yarvtest/test_thread.rb
Normal file
|
@ -0,0 +1,209 @@
|
|||
|
||||
require 'yarvtest/yarvtest'
|
||||
|
||||
class TestThread < YarvTestBase
|
||||
def test_create
|
||||
ae %q{
|
||||
Thread.new{
|
||||
}.join
|
||||
:ok
|
||||
}
|
||||
ae %q{
|
||||
Thread.new{
|
||||
:ok
|
||||
}.value
|
||||
}
|
||||
end
|
||||
|
||||
def test_create_many_threads1
|
||||
ae %q{
|
||||
v = 0
|
||||
(1..200).map{|i|
|
||||
Thread.new{
|
||||
i
|
||||
}
|
||||
}.each{|t|
|
||||
v += t.value
|
||||
}
|
||||
v
|
||||
}
|
||||
end
|
||||
|
||||
def test_create_many_threads2
|
||||
ae %q{
|
||||
5000.times{|e|
|
||||
(1..2).map{
|
||||
Thread.new{
|
||||
}
|
||||
}.each{|e|
|
||||
e.join
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def test_create_many_threads3
|
||||
ae %q{
|
||||
5000.times{
|
||||
t = Thread.new{}
|
||||
while t.alive?
|
||||
Thread.pass
|
||||
end
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def test_create_many_threads4
|
||||
ae %q{
|
||||
100.times{
|
||||
Thread.new{loop{Thread.pass}}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def test_raise
|
||||
ae %q{
|
||||
t = Thread.new{
|
||||
sleep
|
||||
}
|
||||
sleep 0.1
|
||||
t.raise
|
||||
begin
|
||||
t.join
|
||||
:ng
|
||||
rescue
|
||||
:ok
|
||||
end
|
||||
}
|
||||
ae %q{
|
||||
t = Thread.new{
|
||||
loop{}
|
||||
}
|
||||
Thread.pass
|
||||
t.raise
|
||||
begin
|
||||
t.join
|
||||
:ng
|
||||
rescue
|
||||
:ok
|
||||
end
|
||||
}
|
||||
ae %q{
|
||||
t = Thread.new{
|
||||
}
|
||||
Thread.pass
|
||||
t.join
|
||||
t.raise # raise to exited thread
|
||||
begin
|
||||
t.join
|
||||
:ok
|
||||
rescue
|
||||
:ng
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
def test_status
|
||||
ae %q{
|
||||
t = Thread.new{
|
||||
loop{}
|
||||
}
|
||||
st = t.status
|
||||
t.kill
|
||||
st
|
||||
}
|
||||
ae %q{
|
||||
t = Thread.new{
|
||||
sleep
|
||||
}
|
||||
sleep 0.1
|
||||
st = t.status
|
||||
t.kill
|
||||
st
|
||||
}
|
||||
ae %q{
|
||||
t = Thread.new{
|
||||
}
|
||||
t.kill
|
||||
sleep 0.1
|
||||
t.status
|
||||
}
|
||||
end
|
||||
|
||||
def test_tlv
|
||||
ae %q{
|
||||
Thread.current[:a] = 1
|
||||
Thread.new{
|
||||
Thread.current[:a] = 10
|
||||
Thread.pass
|
||||
Thread.current[:a]
|
||||
}.value + Thread.current[:a]
|
||||
}
|
||||
end
|
||||
|
||||
def test_thread_group
|
||||
ae %q{
|
||||
ptg = Thread.current.group
|
||||
Thread.new{
|
||||
ctg = Thread.current.group
|
||||
[ctg.class, ctg == ptg]
|
||||
}.value
|
||||
}
|
||||
ae %q{
|
||||
thg = ThreadGroup.new
|
||||
|
||||
t = Thread.new{
|
||||
thg.add Thread.current
|
||||
sleep
|
||||
}
|
||||
sleep 0.1
|
||||
[thg.list.size, ThreadGroup::Default.list.size]
|
||||
}
|
||||
end
|
||||
|
||||
def test_thread_local_svar
|
||||
ae %q{
|
||||
/a/ =~ 'a'
|
||||
$a = $~
|
||||
Thread.new{
|
||||
$b = $~
|
||||
/a/ =~ 'a'
|
||||
$c = $~
|
||||
}
|
||||
$d = $~
|
||||
[$a == $d, $b, $c != $d]
|
||||
}
|
||||
end
|
||||
|
||||
def test_join
|
||||
ae %q{
|
||||
Thread.new{
|
||||
:ok
|
||||
}.join.value
|
||||
}
|
||||
ae %q{
|
||||
begin
|
||||
Thread.new{
|
||||
raise "ok"
|
||||
}.join
|
||||
rescue => e
|
||||
e
|
||||
end
|
||||
}
|
||||
ae %q{
|
||||
ans = nil
|
||||
t = Thread.new{
|
||||
begin
|
||||
sleep 0.5
|
||||
ensure
|
||||
ans = :ok
|
||||
end
|
||||
}
|
||||
Thread.pass
|
||||
t.kill
|
||||
t.join
|
||||
ans
|
||||
}
|
||||
end
|
||||
end
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue