mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
thread_sync.c (rb_mutex_synchronize): only unlock if we own the mutex
If an exception is raised inside Mutex#sleep (via ConditionVariable#wait), we cannot guarantee we can own the mutex in the ensure callback. However, who owns the mutex at that point does not matter. What matters is the Mutex is usable after an exception occurs. * thread_sync.c (rb_mutex_synchronize): only unlock if we own the mutex * spec/ruby/library/conditionvariable/wait_spec.rb: only test lock usability after thread kill. Who owns the lock at any particular moment is an implementation detail which we cannot easily guarantee. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64441 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
6e0d69e4a7
commit
647fc1227a
2 changed files with 56 additions and 44 deletions
|
@ -23,21 +23,15 @@ describe "ConditionVariable#wait" do
|
|||
th.join
|
||||
end
|
||||
|
||||
it "reacquires the lock even if the thread is killed" do
|
||||
it "the lock remains usable 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
|
||||
cv.wait(m)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -49,24 +43,19 @@ describe "ConditionVariable#wait" do
|
|||
th.kill
|
||||
th.join
|
||||
|
||||
owned.should == true
|
||||
m.try_lock.should == true
|
||||
m.unlock
|
||||
end
|
||||
|
||||
it "reacquires the lock even if the thread is killed after being signaled" do
|
||||
it "lock remains usable 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
|
||||
cv.wait(m)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -84,7 +73,8 @@ describe "ConditionVariable#wait" do
|
|||
}
|
||||
|
||||
th.join
|
||||
owned.should == true
|
||||
m.try_lock.should == true
|
||||
m.unlock
|
||||
end
|
||||
|
||||
it "supports multiple Threads waiting on the same ConditionVariable and Mutex" do
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue