Project

General

Profile

Bug #14999

Updated by Eregon (Benoit Daloze) over 5 years ago

These specs reproduce the issue: 
 https://raw.githubusercontent.com/oracle/truffleruby/master/spec/ruby/library/conditionvariable/wait_spec.rb 

 I can commit them, but of course they will fail. 
 Feel free to just copy it to MRI's spec/ruby/library/conditionvariable/wait_spec.rb 
 (I would do it when whens synchronizing specs anyway) 

 I'd guess it's caused by the recent timer thread changes or so. 
 This spec works fine on 2.5.1 and older. 

 Just copy-pasting the spec out allows for a standalone reproducer: 

 ~~~ ruby 
 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 
 ~~~ 

 Result on trunk: 
 ~~~ 
 The Thread doesn't own the Mutex! 
 #<Thread:0x0000565216f4ba28@cv_bug.rb:6 aborting> terminated with exception (report_on_exception is true): 
 Traceback (most recent call last): 
	 1: from cv_bug.rb:7:in `block in <main>' 
 cv_bug.rb:7:in `synchronize': Attempt to unlock a mutex which is not locked (ThreadError) 
 Traceback (most recent call last): 
	 1: from cv_bug.rb:7:in `block in <main>' 
 cv_bug.rb:7:in `synchronize': Attempt to unlock a mutex which is not locked (ThreadError) 
 ~~~

Back