Skip to content

Commit

Permalink
* test/ruby/test_thread.rb: new tests from Sylvain Joyeux in
Browse files Browse the repository at this point in the history
  [ruby-Patches-19361].


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15930 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
nobu committed Apr 9, 2008
1 parent 0852b77 commit 5098d7a
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 3 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
48 changes: 48 additions & 0 deletions test/ruby/lbtest.rb
Original file line number Diff line number Diff line change
@@ -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."
77 changes: 77 additions & 0 deletions test/ruby/test_thread.rb
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -20,6 +29,74 @@ def test_mutex_synchronize
}
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
Expand Down
6 changes: 3 additions & 3 deletions version.h
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
#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
#define RUBY_VERSION_MINOR 9
#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[];
Expand Down

0 comments on commit 5098d7a

Please sign in to comment.