diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-09-09 11:34:47 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-09-09 11:34:47 +0000 |
commit | 2248a8ce643509577dd29988f5ea1e662f4aaa65 (patch) | |
tree | 17385d76e32660ce60ebda88777e0cad6df50076 /test/thread/test_sync.rb | |
parent | 5dbbee86b616424ee9800488a381b02f9e7c65b3 (diff) |
* lib/sync.rb (Sync_m#sync_lock): Fixed wakeup/raise unsafe code.
Patched by Masaki Matsushita. [Bug #5355] [ruby-dev:44521]
* test/thread/test_sync.rb (test_sync_lock_and_wakeup,
test_sync_upgrade_and_wakeup, test_sync_lock_and_raise):
new test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36936 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/thread/test_sync.rb')
-rw-r--r-- | test/thread/test_sync.rb | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/test/thread/test_sync.rb b/test/thread/test_sync.rb new file mode 100644 index 0000000000..870a8e2d39 --- /dev/null +++ b/test/thread/test_sync.rb @@ -0,0 +1,57 @@ +require 'test/unit' +require 'sync' +require 'timeout' + +class SyncTest < Test::Unit::TestCase + class Tester + include Sync_m + end + + def test_sync_lock_and_wakeup + tester = Tester.new + + tester.sync_lock(:EX) + + t = Thread.new { tester.sync_lock(:EX) } + + sleep 0.1 until t.stop? + t.wakeup + sleep 0.1 until t.stop? + + assert_equal(tester.sync_waiting.uniq, tester.sync_waiting) + end + + def test_sync_upgrade_and_wakeup + tester = Tester.new + tester.sync_lock(:SH) + + t = Thread.new do + tester.sync_lock(:SH) + tester.sync_lock(:EX) + end + + sleep 0.1 until t.stop? + t.wakeup + sleep 0.1 until t.stop? + + tester.sync_upgrade_waiting.each { |ary| + assert(!tester.sync_waiting.include?(ary[0])) + } + assert_equal(tester.sync_waiting.uniq, tester.sync_waiting) + assert_equal(tester.sync_waiting, []) + end + + def test_sync_lock_and_raise + tester= Tester.new + tester.sync_lock(:EX) + + t = Thread.new { tester.sync_lock(:EX) } + + sleep 0.1 until t.stop? + t.raise + sleep 0.1 while t.alive? + + assert_equal(tester.sync_waiting.uniq, tester.sync_waiting) + assert_equal(tester.sync_waiting, []) + end +end |