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:
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