#!/usr/bin/ruby
#
# You may specify the path to the FastCGI crash log (a log of unhandled
# exceptions which forced the FastCGI instance to exit, great for debugging)
# and the number of requests to process before running garbage collection.
#
# By default, the FastCGI crash log is RAILS_ROOT/log/fastcgi.crash.log
# and the GC period is nil (turned off).  A reasonable number of requests
# could range from 10-100 depending on the memory footprint of your app.
#
# Example:
#   # Default log path, normal GC behavior.
#   RailsFCGIHandler.process!
#
#   # Default log path, 50 requests between GC.
#   RailsFCGIHandler.process! nil, 50
#
#   # Custom log path, normal GC behavior.
#   RailsFCGIHandler.process! '/var/log/myapp_fcgi_crash.log'
#
require File.dirname(__FILE__) + "/../config/environment"
require 'fcgi_handler'

class RailsFCGIHandler
  def exit_now_handler(signal)
    dispatcher_log :info, "asked to terminate immediately"
    @when_ready = :exit
  end

    def process_each_request!(provider)
      cgi = nil
      provider.each_cgi do |cgi|
        with_signal_handler 'USR1' do
          process_request(cgi)
        end

        case when_ready
          when :reload
            reload!
          when :restart
            close_connection(cgi)
            restart!
          when :exit
            close_connection(cgi)
            exit
            break
          when :breakpoint
            close_connection(cgi)
            breakpoint!
        end

        gc_countdown
      end
    rescue SignalException => signal
      raise unless signal.message == 'SIGUSR1'
      close_connection(cgi) if cgi
    end
end

RailsFCGIHandler.process! "../log/fastcgi.crash.log", 50
