Bug #14999
Updated by Eregon (Benoit Daloze) over 6 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) ~~~