# File lib/mongrel.rb, line 666
666:     def run
667:       BasicSocket.do_not_reverse_lookup=true
668: 
669:       configure_socket_options
670: 
671:       @socket.setsockopt(Socket::SOL_TCP, $tcp_defer_accept_opts[0], $tcp_defer_accept_opts[1]) if $tcp_defer_accept_opts
672: 
673:       @acceptor = Thread.new do
674:         while true
675:           begin
676:             client = @socket.accept
677:             client.setsockopt(Socket::SOL_TCP, $tcp_cork_opts[0], $tcp_cork_opts[1]) if $tcp_cork_opts
678: 
679:             worker_list = @workers.list
680: 
681:             if worker_list.length >= @num_processors
682:               STDERR.puts "Server overloaded with #{worker_list.length} processors (#@num_processors max). Dropping connection."
683:               client.close rescue Object
684:               reap_dead_workers("max processors")
685:             else
686:               thread = Thread.new { process_client(client) }
687:               thread.abort_on_exception = true
688:               thread[:started_on] = Time.now
689:               @workers.add(thread)
690: 
691:               sleep @timeout/100 if @timeout > 0
692:             end
693:           rescue StopServer
694:             @socket.close rescue Object
695:             break
696:           rescue Errno::EMFILE
697:             reap_dead_workers("too many open files")
698:             sleep 0.5
699:           rescue Errno::ECONNABORTED
700:             # client closed the socket even before accept
701:             client.close rescue Object
702:           rescue Object => exc
703:             STDERR.puts "!!!!!! UNHANDLED EXCEPTION! #{exc}.  TELL ZED HE'S A MORON."
704:             STDERR.puts $!.backtrace.join("\n") if $mongrel_debug_client
705:           end
706:         end
707: 
708:         graceful_shutdown
709:       end
710: 
711:       return @acceptor
712:     end