def accept
begin
begin
open_server
@accept_lock.synchronize{
@accept_state = :open
@accept_thread = Thread.current
}
loop do
begin
socket = @server.accept
socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
rescue
@logger.warning("[#{Time.now.httpdate}] accept error: #{$!.message} (#{$!.class}): #{$!.backtrace[0]}")
retry
end
@socket_queue.push(socket)
end
rescue ServerRestartException
sleep(0.1)
close_server
reset
retry
end
rescue ServerStopException
sleep(0.1)
ensure
@accept_lock.synchronize{
@accept_state = :close
@accept_thread = nil
}
close_server
until (@socket_queue.empty?)
socket = @socket_queue.pop
socket.shutdown
end
end
nil
end