aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/metal/live.rb
diff options
context:
space:
mode:
authorAlex Chinn <alex.chinn@shopify.com>2016-08-15 17:08:46 -0400
committerAlex Chinn <alex.chinn@shopify.com>2016-08-15 17:10:00 -0400
commit285d7cad6a4b93cdeea469e6cc4504a934907746 (patch)
treea347432f926845386f0d5b82878daf33d30df600 /actionpack/lib/action_controller/metal/live.rb
parentc8d9a11df20c1ab238646012318ecb93ca3629d5 (diff)
downloadrails-285d7cad6a4b93cdeea469e6cc4504a934907746.tar.gz
rails-285d7cad6a4b93cdeea469e6cc4504a934907746.tar.bz2
rails-285d7cad6a4b93cdeea469e6cc4504a934907746.zip
Fix deadlock that can occur when child live thread tries to load a constant after writing to the stream.
Diffstat (limited to 'actionpack/lib/action_controller/metal/live.rb')
-rw-r--r--actionpack/lib/action_controller/metal/live.rb7
1 files changed, 6 insertions, 1 deletions
diff --git a/actionpack/lib/action_controller/metal/live.rb b/actionpack/lib/action_controller/metal/live.rb
index a18055c899..26a16104db 100644
--- a/actionpack/lib/action_controller/metal/live.rb
+++ b/actionpack/lib/action_controller/metal/live.rb
@@ -205,7 +205,12 @@ module ActionController
private
def each_chunk(&block)
- while str = @buf.pop
+ loop do
+ str = nil
+ ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
+ str = @buf.pop
+ end
+ break unless str
yield str
end
end