From: eregontp@... Date: 2018-08-18T15:56:33+00:00 Subject: [ruby-core:88543] [Ruby trunk Bug#14999] ConditionVariable doesn't reacquire the Mutex if Thread#kill-ed Issue #14999 has been updated by Eregon (Benoit Daloze). It failed for http://ci.rvm.jp/results/trunk_gcc6@silicon-docker/1235550 ---------------------------------------- Bug #14999: ConditionVariable doesn't reacquire the Mutex if Thread#kill-ed https://bugs.ruby-lang.org/issues/14999#change-73604 * Author: Eregon (Benoit Daloze) * Status: Open * Priority: Normal * Assignee: normalperson (Eric Wong) * Target version: * ruby -v: ruby 2.6.0dev (2018-08-16 trunk 64394) [x86_64-linux] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- 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 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! # terminated with exception (report_on_exception is true): Traceback (most recent call last): 1: from cv_bug.rb:7:in `block in
' 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
' cv_bug.rb:7:in `synchronize': Attempt to unlock a mutex which is not locked (ThreadError) ~~~ -- https://bugs.ruby-lang.org/ Unsubscribe: