# File lib/mongrel.rb, line 602
    def run
      BasicSocket.do_not_reverse_lookup=true

      @acceptor = Thread.new do
        while true
          begin
            client = @socket.accept
            worker_list = @workers.list

            if worker_list.length >= @num_processors
              STDERR.puts "Server overloaded with #{worker_list.length} processors (#@num_processors max). Dropping connection."
              client.close
              reap_dead_workers(worker_list)
            else
              thread = Thread.new do
                process_client(client)
              end

              thread[:started_on] = Time.now
              thread.priority=1
              @workers.add(thread)

              sleep @timeout/100 if @timeout > 0
            end
          rescue StopServer
            @socket.close if not @socket.closed?
            break
          rescue Errno::EMFILE
            STDERR.puts "Too many open files.  Try increasing ulimits."
            sleep 0.5
          end
        end

        # troll through the threads that are waiting and kill any that take too long
        # TODO: Allow for death time to be set if people ask for it.
        @death_time = 10
        shutdown_start = Time.now

        while @workers.list.length > 0
          waited_for = (Time.now - shutdown_start).ceil
          STDERR.print "Shutdown waited #{waited_for} for #{@workers.list.length} requests, could take #{@death_time + @timeout} seconds.\r" if @workers.list.length > 0
          sleep 1
          reap_dead_workers(@workers.list)
        end
      end

      return @acceptor
    end