Class for spawning Rack applications.
Methods
Included Modules
Public Class methods
[ show source ]
# File lib/phusion_passenger/rack/application_spawner.rb, line 39
39: def self.spawn_application(*args)
40: @@instance ||= ApplicationSpawner.new
41: @@instance.spawn_application(*args)
42: end
Public Instance methods
Spawn an instance of the given Rack application. When successful, an Application object will be returned, which represents the spawned application.
Accepts the same options as Railz::ApplicationSpawner#initialize.
Raises:
- AppInitError: The Rack application raised an exception or called exit() during startup.
- SystemCallError, IOError, SocketError: Something went wrong.
[ show source ]
# File lib/phusion_passenger/rack/application_spawner.rb, line 54
54: def spawn_application(app_root, options = {})
55: options = sanitize_spawn_options(options)
56:
57: a, b = UNIXSocket.pair
58: pid = safe_fork(self.class.to_s, true) do
59: a.close
60:
61: file_descriptors_to_leave_open = [0, 1, 2, b.fileno]
62: NativeSupport.close_all_file_descriptors(file_descriptors_to_leave_open)
63: close_all_io_objects_for_fds(file_descriptors_to_leave_open)
64:
65: run(MessageChannel.new(b), app_root, options)
66: end
67: b.close
68: Process.waitpid(pid) rescue nil
69:
70: channel = MessageChannel.new(a)
71: unmarshal_and_raise_errors(channel, !!options["print_exceptions"], "rack")
72:
73: # No exception was raised, so spawning succeeded.
74: pid, socket_name, socket_type = channel.read
75: if pid.nil?
76: raise IOError, "Connection closed"
77: end
78: owner_pipe = channel.recv_io
79: return Application.new(@app_root, pid, socket_name,
80: socket_type, owner_pipe)
81: end