summaryrefslogtreecommitdiff
path: root/spec/ruby/library/conditionvariable
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/library/conditionvariable')
-rw-r--r--spec/ruby/library/conditionvariable/broadcast_spec.rb40
-rw-r--r--spec/ruby/library/conditionvariable/marshal_dump_spec.rb9
-rw-r--r--spec/ruby/library/conditionvariable/signal_spec.rb77
-rw-r--r--spec/ruby/library/conditionvariable/wait_spec.rb175
4 files changed, 0 insertions, 301 deletions
diff --git a/spec/ruby/library/conditionvariable/broadcast_spec.rb b/spec/ruby/library/conditionvariable/broadcast_spec.rb
deleted file mode 100644
index d88159df23..0000000000
--- a/spec/ruby/library/conditionvariable/broadcast_spec.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-require_relative '../../spec_helper'
-require 'thread'
-
-describe "ConditionVariable#broadcast" do
- it "releases all threads waiting in line for this resource" do
- m = Mutex.new
- cv = ConditionVariable.new
- threads = []
- r1 = []
- r2 = []
-
- # large number to attempt to cause race conditions
- 100.times do |i|
- threads << Thread.new(i) do |tid|
- m.synchronize do
- r1 << tid
- cv.wait(m)
- r2 << tid
- end
- end
- end
-
- # wait for all threads to acquire the mutex the first time
- Thread.pass until m.synchronize { r1.size == threads.size }
- # wait until all threads are sleeping (ie waiting)
- Thread.pass until threads.all?(&:stop?)
-
- r2.should be_empty
- m.synchronize do
- cv.broadcast
- end
-
- threads.each {|t| t.join }
-
- # ensure that all threads that enter cv.wait are released
- r2.sort.should == r1.sort
- # note that order is not specified as broadcast results in a race
- # condition on regaining the lock m
- end
-end
diff --git a/spec/ruby/library/conditionvariable/marshal_dump_spec.rb b/spec/ruby/library/conditionvariable/marshal_dump_spec.rb
deleted file mode 100644
index f951a13e28..0000000000
--- a/spec/ruby/library/conditionvariable/marshal_dump_spec.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-require_relative '../../spec_helper'
-require 'thread'
-
-describe "ConditionVariable#marshal_dump" do
- it "raises a TypeError" do
- cv = ConditionVariable.new
- -> { cv.marshal_dump }.should raise_error(TypeError, /can't dump/)
- end
-end
diff --git a/spec/ruby/library/conditionvariable/signal_spec.rb b/spec/ruby/library/conditionvariable/signal_spec.rb
deleted file mode 100644
index 86383073f1..0000000000
--- a/spec/ruby/library/conditionvariable/signal_spec.rb
+++ /dev/null
@@ -1,77 +0,0 @@
-require_relative '../../spec_helper'
-require 'thread'
-
-describe "ConditionVariable#signal" do
- it "releases the first thread waiting in line for this resource" do
- m = Mutex.new
- cv = ConditionVariable.new
- threads = []
- r1 = []
- r2 = []
-
- # large number to attempt to cause race conditions
- 100.times do |i|
- threads << Thread.new(i) do |tid|
- m.synchronize do
- r1 << tid
- cv.wait(m)
- r2 << tid
- end
- end
- end
-
- # wait for all threads to acquire the mutex the first time
- Thread.pass until m.synchronize { r1.size == threads.size }
- # wait until all threads are sleeping (ie waiting)
- Thread.pass until threads.all?(&:stop?)
-
- r2.should be_empty
- 100.times do |i|
- m.synchronize do
- cv.signal
- end
- Thread.pass until r2.size == i+1
- end
-
- threads.each {|t| t.join }
-
- # ensure that all the threads that went into the cv.wait are
- # released in the same order
- r2.should == r1
- end
-
- it "allows control to be passed between a pair of threads" do
- m = Mutex.new
- cv = ConditionVariable.new
- repeats = 100
- in_synchronize = false
-
- t1 = Thread.new do
- m.synchronize do
- in_synchronize = true
- repeats.times do
- cv.wait(m)
- cv.signal
- end
- end
- end
-
- # Make sure t1 is waiting for a signal before launching t2.
- Thread.pass until in_synchronize
- Thread.pass until t1.stop?
-
- t2 = Thread.new do
- m.synchronize do
- repeats.times do
- cv.signal
- cv.wait(m)
- end
- end
- end
-
- # Check that both threads terminated without exception
- t1.join
- t2.join
- m.should_not.locked?
- end
-end
diff --git a/spec/ruby/library/conditionvariable/wait_spec.rb b/spec/ruby/library/conditionvariable/wait_spec.rb
deleted file mode 100644
index 9a68c2b5a1..0000000000
--- a/spec/ruby/library/conditionvariable/wait_spec.rb
+++ /dev/null
@@ -1,175 +0,0 @@
-require_relative '../../spec_helper'
-require 'thread'
-
-describe "ConditionVariable#wait" do
- it "calls #sleep on the given object" do
- o = Object.new
- o.should_receive(:sleep).with(1234)
-
- cv = ConditionVariable.new
-
- cv.wait(o, 1234)
- end
-
- it "can be woken up by ConditionVariable#signal" do
- m = Mutex.new
- cv = ConditionVariable.new
- in_synchronize = false
-
- th = Thread.new do
- m.synchronize do
- in_synchronize = true
- cv.wait(m)
- end
- :success
- end
-
- # wait for m to acquire the mutex
- Thread.pass until in_synchronize
- # wait until th is sleeping (ie waiting)
- Thread.pass until th.stop?
-
- m.synchronize { cv.signal }
- th.value.should == :success
- end
-
- it "can be interrupted by Thread#run" do
- m = Mutex.new
- cv = ConditionVariable.new
- in_synchronize = false
-
- th = Thread.new do
- m.synchronize do
- in_synchronize = true
- cv.wait(m)
- end
- :success
- end
-
- # wait for m to acquire the mutex
- Thread.pass until in_synchronize
- # wait until th is sleeping (ie waiting)
- Thread.pass until th.stop?
-
- th.run
- th.value.should == :success
- end
-
- it "can be interrupted by Thread#wakeup" do
- m = Mutex.new
- cv = ConditionVariable.new
- in_synchronize = false
-
- th = Thread.new do
- m.synchronize do
- in_synchronize = true
- cv.wait(m)
- end
- :success
- end
-
- # wait for m to acquire the mutex
- Thread.pass until in_synchronize
- # wait until th is sleeping (ie waiting)
- Thread.pass until th.stop?
-
- th.wakeup
- th.value.should == :success
- end
-
- it "reacquires the lock even if the thread is killed" do
- m = Mutex.new
- cv = ConditionVariable.new
- in_synchronize = false
- owned = nil
-
- th = Thread.new do
- m.synchronize do
- in_synchronize = true
- begin
- cv.wait(m)
- ensure
- owned = m.owned?
- $stderr.puts "\nThe Thread doesn't own the Mutex!" unless owned
- end
- end
- end
-
- # wait for m to acquire the mutex
- Thread.pass until in_synchronize
- # wait until th is sleeping (ie waiting)
- Thread.pass until th.stop?
-
- th.kill
- th.join
-
- owned.should == true
- end
-
- it "reacquires the lock even if the thread is killed after being signaled" do
- m = Mutex.new
- cv = ConditionVariable.new
- in_synchronize = false
- owned = nil
-
- th = Thread.new do
- m.synchronize do
- in_synchronize = true
- begin
- cv.wait(m)
- ensure
- owned = m.owned?
- $stderr.puts "\nThe Thread doesn't own the Mutex!" unless owned
- end
- end
- end
-
- # wait for m to acquire the mutex
- Thread.pass until in_synchronize
- # wait until th is sleeping (ie waiting)
- Thread.pass until th.stop?
-
- m.synchronize {
- cv.signal
- # Wait that the thread is blocked on acquiring the Mutex
- sleep 0.001
- # Kill the thread, yet the thread should first acquire the Mutex before going on
- th.kill
- }
-
- th.join
- owned.should == true
- end
-
- it "supports multiple Threads waiting on the same ConditionVariable and Mutex" do
- m = Mutex.new
- cv = ConditionVariable.new
- n_threads = 4
- events = []
-
- threads = n_threads.times.map {
- Thread.new {
- m.synchronize {
- events << :t_in_synchronize
- cv.wait(m)
- }
- }
- }
-
- Thread.pass until m.synchronize { events.size } == n_threads
- Thread.pass until threads.any?(&:stop?)
- m.synchronize do
- threads.each { |t|
- # Cause interactions with the waiting threads.
- # On TruffleRuby, this causes a safepoint which has interesting
- # interactions with the ConditionVariable.
- bt = t.backtrace
- bt.should be_kind_of(Array)
- bt.size.should >= 2
- }
- end
-
- cv.broadcast
- threads.each(&:join)
- end
-end