# File lib/mongrel.rb, line 609
609:     def run
610:       BasicSocket.do_not_reverse_lookup=true
611: 
612:       @acceptor = Thread.new do
613:         while true
614:           begin
615:             client = @socket.accept
616:             worker_list = @workers.list
617: 
618:             if worker_list.length >= @num_processors
619:               STDERR.puts "Server overloaded with #{worker_list.length} processors (#@num_processors max). Dropping connection."
620:               client.close
621:               reap_dead_workers(worker_list)
622:             else
623:               thread = Thread.new do
624:                 process_client(client)
625:               end
626: 
627:               thread[:started_on] = Time.now
628:               thread.priority=1
629:               @workers.add(thread)
630: 
631:               sleep @timeout/100 if @timeout > 0
632:             end
633:           rescue StopServer
634:             @socket.close if not @socket.closed?
635:             break
636:           rescue Errno::EMFILE
637:             STDERR.puts "Too many open files.  Try increasing ulimits."
638:             sleep 0.5
639:           end
640:         end
641: 
642:         # troll through the threads that are waiting and kill any that take too long
643:         # TODO: Allow for death time to be set if people ask for it.
644:         @death_time = 10
645:         shutdown_start = Time.now
646: 
647:         while @workers.list.length > 0
648:           waited_for = (Time.now - shutdown_start).ceil
649:           STDERR.print "Shutdown waited #{waited_for} for #{@workers.list.length} requests, could take #{@death_time + @timeout} seconds.\r" if @workers.list.length > 0
650:           sleep 1
651:           reap_dead_workers(@workers.list)
652:         end
653:       end
654: 
655:       return @acceptor
656:     end