From e9020ac4310d1b190619769a8a621935d4efc812 Mon Sep 17 00:00:00 2001 From: Matthew Draper Date: Tue, 21 Jul 2015 11:48:21 +0930 Subject: Handle thread death during lock acquisition Specifically, clean up if the thread is killed while it's blocked awaiting the lock... if we get killed on some other arbitrary line, the result remains quite undefined. --- activesupport/lib/active_support/concurrency/share_lock.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'activesupport/lib/active_support/concurrency') diff --git a/activesupport/lib/active_support/concurrency/share_lock.rb b/activesupport/lib/active_support/concurrency/share_lock.rb index 39ae9bfb79..ca48164c54 100644 --- a/activesupport/lib/active_support/concurrency/share_lock.rb +++ b/activesupport/lib/active_support/concurrency/share_lock.rb @@ -54,10 +54,12 @@ module ActiveSupport loose_shares = @sharing.delete(Thread.current) @waiting[Thread.current] = compatible if loose_shares - @cv.wait_while { busy?(purpose) } - - @waiting.delete Thread.current - @sharing[Thread.current] = loose_shares if loose_shares + begin + @cv.wait_while { busy?(purpose) } + ensure + @waiting.delete Thread.current + @sharing[Thread.current] = loose_shares if loose_shares + end end @exclusive_thread = Thread.current end -- cgit v1.2.3