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