def self.spawn_application(options)
options = sanitize_spawn_options(options)
a, b = UNIXSocket.pair
pid = safe_fork('application', true) do
a.close
file_descriptors_to_leave_open = [0, 1, 2, b.fileno]
NativeSupport.close_all_file_descriptors(file_descriptors_to_leave_open)
close_all_io_objects_for_fds(file_descriptors_to_leave_open)
channel = MessageChannel.new(b)
success = report_app_init_status(channel) do
prepare_app_process('config/environment.rb', options)
require File.expand_path('config/environment')
require 'dispatcher'
after_loading_app_code(options)
end
if success
start_request_handler(channel, false, options)
end
end
b.close
Process.waitpid(pid) rescue nil
channel = MessageChannel.new(a)
unmarshal_and_raise_errors(channel, options["print_exceptions"])
return AppProcess.read_from_channel(channel)
end