def run
BasicSocket.do_not_reverse_lookup=true
configure_socket_options
@socket.setsockopt(Socket::SOL_TCP, $tcp_defer_accept_opts[0], $tcp_defer_accept_opts[1]) if $tcp_defer_accept_opts
@acceptor = Thread.new do
while true
begin
client = @socket.accept
client.setsockopt(Socket::SOL_TCP, $tcp_cork_opts[0], $tcp_cork_opts[1]) if $tcp_cork_opts
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 rescue Object
reap_dead_workers("max processors")
else
thread = Thread.new { process_client(client) }
thread.abort_on_exception = true
thread[:started_on] = Time.now
@workers.add(thread)
sleep @timeout/100 if @timeout > 0
end
rescue StopServer
@socket.close rescue Object
break
rescue Errno::EMFILE
reap_dead_workers("too many open files")
sleep 0.5
rescue Errno::ECONNABORTED
client.close rescue Object
rescue Object => exc
STDERR.puts "!!!!!! UNHANDLED EXCEPTION! #{exc}. TELL ZED HE'S A MORON."
STDERR.puts $!.backtrace.join("\n") if $mongrel_debug_client
end
end
graceful_shutdown
end
return @acceptor
end