diff options
| author | Jack Nagel | 2015-04-24 22:13:45 -0400 |
|---|---|---|
| committer | Jack Nagel | 2015-04-25 23:17:13 -0400 |
| commit | f7ded45bc713e20e7c43dba89918e4ad2733ad69 (patch) | |
| tree | 266672e67cf47be2be7461e7c6ac26f66845fa3d | |
| parent | 16dfe3dd4000ce3d97cb2a0087946c9b2ead5665 (diff) | |
| download | brew-f7ded45bc713e20e7c43dba89918e4ad2733ad69.tar.bz2 | |
Clean up socket and filesystem resources separately
| -rw-r--r-- | Library/Homebrew/utils/fork.rb | 66 |
1 files changed, 33 insertions, 33 deletions
diff --git a/Library/Homebrew/utils/fork.rb b/Library/Homebrew/utils/fork.rb index defe1fa79..5504a576a 100644 --- a/Library/Homebrew/utils/fork.rb +++ b/Library/Homebrew/utils/fork.rb @@ -3,42 +3,42 @@ require "socket" module Utils def self.safe_fork(&block) - socket_path = "#{Dir.mktmpdir("homebrew", HOMEBREW_TEMP)}/socket" - server = UNIXServer.new(socket_path) - ENV["HOMEBREW_ERROR_PIPE"] = socket_path - read, write = IO.pipe + Dir.mktmpdir("homebrew", HOMEBREW_TEMP) do |tmpdir| + UNIXServer.open("#{tmpdir}/socket") do |server| + read, write = IO.pipe - pid = fork do - begin - server.close - read.close - write.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) - yield - rescue Exception => e - Marshal.dump(e, write) - write.close - exit! 1 - end - end + pid = fork do + ENV["HOMEBREW_ERROR_PIPE"] = server.path + + begin + server.close + read.close + write.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) + yield + rescue Exception => e + Marshal.dump(e, write) + write.close + exit! 1 + end + end - ignore_interrupts(:quietly) do # the child will receive the interrupt and marshal it back - begin - socket = server.accept_nonblock - rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR - retry unless Process.waitpid(pid, Process::WNOHANG) - else - socket.send_io(write) + ignore_interrupts(:quietly) do # the child will receive the interrupt and marshal it back + begin + socket = server.accept_nonblock + rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR + retry unless Process.waitpid(pid, Process::WNOHANG) + else + socket.send_io(write) + end + write.close + data = read.read + read.close + Process.wait(pid) unless socket.nil? + raise Marshal.load(data) unless data.nil? or data.empty? + raise Interrupt if $?.exitstatus == 130 + raise "Suspicious failure" unless $?.success? + end end - write.close - data = read.read - read.close - Process.wait(pid) unless socket.nil? - raise Marshal.load(data) unless data.nil? or data.empty? - raise Interrupt if $?.exitstatus == 130 - raise "Suspicious failure" unless $?.success? end - ensure - server.close - FileUtils.rm_r File.dirname(socket_path) end end |
