module PhusionPassenger::PreloaderSharedHelpers

def run_main_loop(options)

def run_main_loop(options)
	$0 = "Passenger AppPreloader: #{options['app_root']}"
	client = nil
	original_pid = Process.pid
	socket_filename = "#{options['generation_dir']}/backends/preloader.#{Process.pid}"
	server = UNIXServer.new(socket_filename)
	server.close_on_exec!
	
	# Update the dump information just before telling the preloader that we're
	# ready because the HelperAgent will read and memorize this information.
	LoaderSharedHelpers.dump_all_information
	puts "!> Ready"
	puts "!> socket: unix:#{socket_filename}"
	puts "!> "
	
	while true
		# We call ::select just in case someone overwrites the global select()
		# function by including ActionView::Helpers in the wrong place.
		# https://code.google.com/p/phusion-passenger/issues/detail?id=915
		ios = Kernel.select([server, STDIN])[0]
		if ios.include?(server)
			result, client = accept_and_process_next_client(server)
			if result == :forked
				STDIN.reopen(client)
				STDOUT.reopen(client)
				STDOUT.sync = true
				client.close
				return :forked
			end
		end
		if ios.include?(STDIN)
			if STDIN.tty?
				begin
					# Prevent bash from exiting when we press Ctrl-D.
					STDIN.read_nonblock(1)
				rescue Errno::EAGAIN
					# Do nothing.
				end
			end
			break
		end
	end
	return nil
ensure
	server.close if server
	if original_pid == Process.pid
		File.unlink(socket_filename) rescue nil
	end
end