From a6bf5fa2bafe19ba871e424ec9bf8a272265e74c Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Fri, 8 Aug 2014 17:31:13 -0500 Subject: [PATCH] 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. --- Library/Homebrew/formula_installer.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 74b1097a88..45c70e6ce9 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