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