[前][次][番号順一覧][スレッド一覧]

ruby-changes:52201

From: eregon <ko1@a...>
Date: Fri, 17 Aug 2018 18:51:31 +0900 (JST)
Subject: [ruby-changes:52201] eregon:r64409 (trunk): Integrate new specs for ConditionVariable#wait to prevent regressions

eregon	2018-08-17 18:51:26 +0900 (Fri, 17 Aug 2018)

  New Revision: 64409

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=64409

  Log:
    Integrate new specs for ConditionVariable#wait to prevent regressions
    
    * See [Bug #14999].

  Modified files:
    trunk/spec/ruby/library/conditionvariable/wait_spec.rb
Index: spec/ruby/library/conditionvariable/wait_spec.rb
===================================================================
--- spec/ruby/library/conditionvariable/wait_spec.rb	(revision 64408)
+++ spec/ruby/library/conditionvariable/wait_spec.rb	(revision 64409)
@@ -22,4 +22,100 @@ describe "ConditionVariable#wait" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/library/conditionvariable/wait_spec.rb#L22
     m.synchronize { cv.signal }
     th.join
   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 while th.status and th.status != "sleep"
+
+    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 while th.status and th.status != "sleep"
+
+    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 while threads.any? { |th| th.status and th.status != "sleep" }
+    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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]