709: def run
710: BasicSocket.do_not_reverse_lookup=true
711:
712: configure_socket_options
713:
714: if $tcp_defer_accept_opts
715: @socket.setsockopt(*$tcp_defer_accept_opts) rescue nil
716: end
717:
718: @acceptor = Thread.new do
719: while true
720: begin
721: client = @socket.accept
722:
723: if $tcp_cork_opts
724: client.setsockopt(*$tcp_cork_opts) rescue nil
725: end
726:
727: worker_list = @workers.list
728:
729: if worker_list.length >= @num_processors
730: STDERR.puts "Server overloaded with #{worker_list.length} processors (#@num_processors max). Dropping connection."
731: client.close rescue Object
732: reap_dead_workers("max processors")
733: else
734: thread = Thread.new(client) {|c| process_client(c) }
735: thread[:started_on] = Time.now
736: @workers.add(thread)
737:
738: sleep @timeout/100 if @timeout > 0
739: end
740: rescue StopServer
741: @socket.close rescue Object
742: break
743: rescue Errno::EMFILE
744: reap_dead_workers("too many open files")
745: sleep 0.5
746: rescue Errno::ECONNABORTED
747:
748: client.close rescue Object
749: rescue Object => exc
750: STDERR.puts "!!!!!! UNHANDLED EXCEPTION! #{exc}. TELL ZED HE'S A MORON."
751: STDERR.puts $!.backtrace.join("\n") if $mongrel_debug_client
752: end
753: end
754: graceful_shutdown
755: end
756:
757: return @acceptor
758: end