aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Nagel2014-08-08 17:31:13 -0500
committerJack Nagel2014-08-08 17:31:13 -0500
commita6bf5fa2bafe19ba871e424ec9bf8a272265e74c (patch)
tree68e7db0eb05697aad6da1d1d9fe61ac0f6419042
parentdfe1de7acd3d61d3a7bf4778ef9fde1a43a6c757 (diff)
downloadbrew-a6bf5fa2bafe19ba871e424ec9bf8a272265e74c.tar.bz2
Read from the error pipe in a separate thread
If the build process tries to write more bytes than will fit in the pipe buffer, it will block until the parent process does a read. However, the parent process will only do a read after the child process has exited or died, leading to a deadlock. Fix this by doing the read in a separate thread.
-rw-r--r--Library/Homebrew/formula_installer.rb3
1 files changed, 2 insertions, 1 deletions
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index 74b1097a8..45c70e6ce 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -515,8 +515,9 @@ class FormulaInstaller
ignore_interrupts(:quietly) do # the child will receive the interrupt and marshal it back
write.close
+ thr = Thread.new { read.read }
Process.wait(pid)
- data = read.read
+ data = thr.value
read.close
raise Marshal.load(data) unless data.nil? or data.empty?
raise Interrupt if $?.exitstatus == 130