    # File lib/phusion_passenger/abstract_request_handler.rb, line 243
            def main_loop
                    debug("Entering request handler main loop")
                    reset_signal_handlers
                    begin
                            @graceful_termination_pipe = IO.pipe
                            @graceful_termination_pipe[0].close_on_exec!
                            @graceful_termination_pipe[1].close_on_exec!

                            @main_loop_thread_lock.synchronize do
                                    @main_loop_generation += 1
                                    @main_loop_running = true
                                    @main_loop_thread_cond.broadcast

                                    @select_timeout = nil

                                    @selectable_sockets = []
                                    @server_sockets.each_value do |value|
                                            socket = value[2]
                                            @selectable_sockets << socket if socket
                                    end
                                    @selectable_sockets << @owner_pipe
                                    @selectable_sockets << @graceful_termination_pipe[0]
                            end

                            install_useful_signal_handlers
                            socket_wrapper = Utils::UnseekableSocket.new
                            channel        = MessageChannel.new
                            buffer         = ''

                            while true
                                    @iterations += 1
                                    if !accept_and_process_next_request(socket_wrapper, channel, buffer)
                                            trace(2, "Request handler main loop exited normally")
                                            break
                                    end
                                    @processed_requests += 1
                            end
                    rescue EOFError
                            # Exit main loop.
                            trace(2, "Request handler main loop interrupted by EOFError exception")
                    rescue Interrupt
                            # Exit main loop.
                            trace(2, "Request handler main loop interrupted by Interrupt exception")
                    rescue SignalException => signal
                            trace(2, "Request handler main loop interrupted by SignalException")
                            if signal.message != HARD_TERMINATION_SIGNAL &&
                               signal.message != SOFT_TERMINATION_SIGNAL
                                    raise
                            end
                    rescue Exception => e
                            trace(2, "Request handler main loop interrupted by #{e.class} exception")
                            raise
                    ensure
                            debug("Exiting request handler main loop")
                            revert_signal_handlers
                            @main_loop_thread_lock.synchronize do
                                    @graceful_termination_pipe[1].close rescue nil
                                    @graceful_termination_pipe[0].close rescue nil
                                    @selectable_sockets = []
                                    @main_loop_generation += 1
                                    @main_loop_running = false
                                    @main_loop_thread_cond.broadcast
                            end
                    end
            end