lib/zeus/server/acceptor.rb in zeus-0.2.0.beta2 vs lib/zeus/server/acceptor.rb in zeus-0.2.0

- old
+ new

@@ -12,25 +12,49 @@ @client_handler = server.client_handler @registration_monitor = server.acceptor_registration_monitor end def register_with_client_handler(pid) - @a, @b = Socket.pair(:UNIX, :STREAM) - @s_client_handler = UNIXSocket.for_fd(@a.fileno) - @s_acceptor = UNIXSocket.for_fd(@b.fileno) + @s_client_handler, @s_acceptor = UNIXSocket.pair @s_acceptor.puts registration_data(pid) @registration_monitor.acceptor_registration_socket.send_io(@s_client_handler) end def registration_data(pid) {pid: pid, commands: [name, *aliases], description: description}.to_json end + def descendent_acceptors + self + end + + def print_error(io, error) + io.puts "#{error.backtrace[0]}: #{error.message} (#{error.class})" + error.backtrace[1..-1].each do |line| + io.puts "\tfrom #{line}" + end + end + + def run_as_error(e) + register_with_client_handler(Process.pid) + Zeus.ui.as_zeus "starting error-state acceptor `#{@name}`" + + Thread.new do + loop do + terminal = @s_acceptor.recv_io + _ = @s_acceptor.readline + @s_acceptor << 0 << "\n" + print_error(terminal, e) + terminal.close + end + end + end + def run - fork { + pid = fork { $0 = "zeus acceptor: #{@name}" pid = Process.pid register_with_client_handler(pid) @@ -49,10 +73,11 @@ loop do prefork_action! terminal = @s_acceptor.recv_io arguments = JSON.parse(@s_acceptor.readline.chomp) child = fork do + $0 = "zeus runner: #{@name}" postfork_action! @s_acceptor << $$ << "\n" $stdin.reopen(terminal) $stdout.reopen(terminal) $stderr.reopen(terminal) @@ -62,9 +87,12 @@ end Process.detach(child) terminal.close end } + currpid = Process.pid + at_exit { Process.kill(9, pid) if Process.pid == currpid rescue nil } + pid end def prefork_action! # TODO : refactor ActiveRecord::Base.clear_all_connections! end