def self.spawn_application(options = {})
options = sanitize_spawn_options(options)
a, b = UNIXSocket.pair
pid = safe_fork(self.class.to_s, 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)
app = nil
success = report_app_init_status(channel) do
prepare_app_process('config.ru', options)
app = load_rack_app
after_loading_app_code(options)
end
if success
start_request_handler(channel, app, false, options)
end
end
b.close
Process.waitpid(pid) rescue nil
channel = MessageChannel.new(a)
unmarshal_and_raise_errors(channel, options["print_exceptions"], "rack")
return AppProcess.read_from_channel(channel)
end