1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby/library/monitor/new_cond_spec.rb
2021-07-29 22:11:21 +02:00

88 lines
1.8 KiB
Ruby

require_relative '../../spec_helper'
require 'monitor'
describe "Monitor#new_cond" do
it "creates a MonitorMixin::ConditionVariable" do
m = Monitor.new
c = m.new_cond
c.class.should == MonitorMixin::ConditionVariable
end
it 'returns a condition variable which can be waited on by a thread holding the monitor' do
m = Monitor.new
c = m.new_cond
10.times do
wait_q = Queue.new
thread = Thread.new do
m.synchronize do
wait_q << true
c.wait
end
:done
end
wait_q.pop
# Synchronize can't happen until the other thread is waiting.
m.synchronize { c.signal }
thread.join
thread.value.should == :done
end
end
it 'returns a condition variable which can be waited on by a thread holding the monitor inside multiple synchronize blocks' do
m = Monitor.new
c = m.new_cond
10.times do
wait_q = Queue.new
thread = Thread.new do
m.synchronize do
m.synchronize do
wait_q << true
c.wait
end
end
:done
end
wait_q.pop
#No need to wait here as we cannot synchronize until the other thread is waiting.
m.synchronize { c.signal }
thread.join
thread.value.should == :done
end
end
it 'returns a condition variable which can be signalled by a thread holding the monitor inside multiple synchronize blocks' do
m = Monitor.new
c = m.new_cond
10.times do
wait_q = Queue.new
thread = Thread.new do
m.synchronize do
wait_q << true
c.wait
end
:done
end
wait_q.pop
# Synchronize can't happen until the other thread is waiting.
m.synchronize { m.synchronize { c.signal } }
thread.join
thread.value.should == :done
end
end
end