def start_transaction
Merb.logger.warn! "Parent pid: #{Process.pid}"
reader, writer = nil, nil
if GC.respond_to?(:copy_on_write_friendly=)
GC.copy_on_write_friendly = true
end
loop do
reader, @writer = IO.pipe
pid = Kernel.fork
break unless pid
@writer.close
Merb::Server.store_pid("main") if Merb::Config[:daemonize] || Merb::Config[:cluster]
if Merb::Config[:console_trap]
Merb.trap("INT") {}
else
Merb.trap("INT") do
Merb.logger.warn! "Reaping Workers"
begin
Process.kill(reap_workers_signal, pid)
rescue SystemCallError
end
exit_gracefully
end
end
Merb.trap("HUP") do
Merb.logger.warn! "Doing a fast deploy\n"
Process.kill("HUP", pid)
end
reader_ary = [reader]
loop do
if exit_status = Process.wait2(pid, Process::WNOHANG)
exit_status[1] && exit_status[1].exitstatus == 128 ? break : exit
end
if select(reader_ary, nil, nil, 0.25)
begin
next if reader.eof?
msg = reader.readline
if msg =~ /128/
Process.detach(pid)
break
else
exit_gracefully
end
rescue SystemCallError
exit_gracefully
end
end
end
end
reader.close
if Merb::Config[:console_trap]
Merb::Server.add_irb_trap
at_exit { reap_workers }
else
Merb.trap('INT') do
Merb::BootLoader.before_worker_shutdown_callbacks.each { |cb| cb.call }
end
Merb.trap('ABRT') { reap_workers }
Merb.trap('HUP') { reap_workers(128, "ABRT") }
end
end