1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* test/ruby/test_thread.rb: new tests from Sylvain Joyeux in

[ruby-Patches-19361].


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15930 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2008-04-09 03:12:03 +00:00
parent 0852b7743b
commit 5098d7ae0d
4 changed files with 133 additions and 3 deletions

View file

@ -1,3 +1,8 @@
Wed Apr 9 12:12:01 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* test/ruby/test_thread.rb: new tests from Sylvain Joyeux in
[ruby-Patches-19361].
Tue Apr 8 21:38:55 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* thread.c (lock_func): optimized. based on a patch from Sylvain

48
test/ruby/lbtest.rb Normal file
View file

@ -0,0 +1,48 @@
require 'thread'
class LocalBarrier
def initialize(n)
@wait = Queue.new
@done = Queue.new
@keeper = begin_keeper(n)
end
def sync
@done.push(true)
@wait.pop
end
def join
@keeper.join
end
private
def begin_keeper(n)
Thread.start do
n.times do
@done.pop
end
n.times do
@wait.push(true)
end
end
end
end
n = 10
lb = LocalBarrier.new(n)
(n - 1).times do |i|
Thread.start do
sleep((rand(n) + 1) / 10.0)
puts "#{i}: done"
lb.sync
puts "#{i}: cont"
end
end
lb.sync
puts "#{n-1}: cone"
puts "exit."

View file

@ -1,6 +1,15 @@
require 'test/unit'
require 'thread'
class TestThread < Test::Unit::TestCase
class Thread < ::Thread
def self.new(*)
th = super
th.abort_on_exception = true
th
end
end
def test_mutex_synchronize
m = Mutex.new
r = 0
@ -20,6 +29,74 @@ class TestThread < Test::Unit::TestCase
}
assert_equal(max * max * max, r)
end
def test_condvar
mutex = Mutex.new
condvar = ConditionVariable.new
result = []
mutex.synchronize do
t = Thread.new do
mutex.synchronize do
result << 1
condvar.signal
end
end
result << 0
condvar.wait(mutex)
result << 2
t.join
end
assert_equal([0, 1, 2], result)
end
def test_condvar_wait_not_owner
mutex = Mutex.new
condvar = ConditionVariable.new
assert_raises(ThreadError) { condvar.wait(mutex) }
end
def test_condvar_wait_exception_handling
# Calling wait in the only thread running should raise a ThreadError of
# 'stopping only thread'
mutex = Mutex.new
condvar = ConditionVariable.new
locked = false
thread = Thread.new do
Thread.current.abort_on_exception = false
mutex.synchronize do
begin
condvar.wait(mutex)
rescue Exception
locked = mutex.locked?
raise
end
end
end
until thread.stop?
sleep(0.1)
end
thread.raise Interrupt, "interrupt a dead condition variable"
assert_raises(Interrupt) { thread.value }
assert(locked)
end
def test_local_barrier
dir = File.dirname(__FILE__)
lbtest = File.join(dir, "lbtest.rb")
$:.unshift File.join(File.dirname(dir), 'ruby')
require 'envutil'
$:.shift
10.times {
result = `#{EnvUtil.rubybin} #{lbtest}`
assert(!$?.coredump?, '[ruby-dev:30653]')
assert_equal("exit.", result[/.*\Z/], '[ruby-dev:30653]')
}
end
end
class TestThreadGroup < Test::Unit::TestCase

View file

@ -1,7 +1,7 @@
#define RUBY_VERSION "1.9.0"
#define RUBY_RELEASE_DATE "2008-04-08"
#define RUBY_RELEASE_DATE "2008-04-09"
#define RUBY_VERSION_CODE 190
#define RUBY_RELEASE_CODE 20080408
#define RUBY_RELEASE_CODE 20080409
#define RUBY_PATCHLEVEL 0
#define RUBY_VERSION_MAJOR 1
@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_YEAR 2008
#define RUBY_RELEASE_MONTH 4
#define RUBY_RELEASE_DAY 8
#define RUBY_RELEASE_DAY 9
#ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[];