mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
88 lines
1.8 KiB
Ruby
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
|