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