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
@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