aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/test/share_lock_test.rb43
1 files changed, 21 insertions, 22 deletions
diff --git a/activesupport/test/share_lock_test.rb b/activesupport/test/share_lock_test.rb
index 5fceebf023..143e65aa0c 100644
--- a/activesupport/test/share_lock_test.rb
+++ b/activesupport/test/share_lock_test.rb
@@ -341,38 +341,37 @@ class ShareLockTest < ActiveSupport::TestCase
threads.each(&:kill) if threads
end
- def test_manual_recursive_yield
+ def test_manual_recursive_yield_cannot_expand_outer_compatible
ready = Concurrent::CyclicBarrier.new(2)
- done = Concurrent::CyclicBarrier.new(2)
do_compatible_nesting = Concurrent::CountDownLatch.new
+ in_compatible_nesting = Concurrent::CountDownLatch.new
- threads = [
- Thread.new do
- @lock.sharing do
- ready.wait
- @lock.exclusive(purpose: :x) {}
- done.wait
- end
- end,
+ incompatible_thread = Thread.new do
+ @lock.sharing do
+ ready.wait
+ @lock.exclusive(purpose: :x) {}
+ end
+ end
- Thread.new do
- @lock.sharing do
- ready.wait
- @lock.yield_shares(compatible: [:y]) do
- do_compatible_nesting.wait
- @lock.sharing do
- @lock.yield_shares(compatible: [:x, :y]) do
- done.wait
- end
+ yield_shares_thread = Thread.new do
+ @lock.sharing do
+ ready.wait
+ @lock.yield_shares(compatible: [:y]) do
+ do_compatible_nesting.wait
+ @lock.sharing do
+ @lock.yield_shares(compatible: [:x, :y]) do
+ in_compatible_nesting.wait
end
end
end
end
- ]
+ end
- assert_threads_stuck threads
+ assert_threads_stuck incompatible_thread
do_compatible_nesting.count_down
- assert_threads_not_stuck threads
+ assert_threads_stuck incompatible_thread
+ in_compatible_nesting.count_down
+ assert_threads_not_stuck [yield_shares_thread, incompatible_thread]
end
def test_manual_recursive_yield_restores_previous_compatible