class Rack::Reloader
also respects a cool down time, during which nothing will be done.
It is performing a check/reload cycle at the start of every request, but
only when actively called.
Please note that this will not reload files in the background, it does so
call stat(2).
any file will only be checked once and there will only be made one system
What makes it especially suited for use in a production environment is that
This class acts as Rack middleware.
High performant source reloader
def call(env)
def call(env) if @cooldown and Time.now > @last + @cooldown if Thread.list.size > 1 @reload_mutex.synchronize{ reload! } else reload! end @last = Time.now end @app.call(env) end
def initialize(app, cooldown = 10, backend = Stat)
def initialize(app, cooldown = 10, backend = Stat) @app = app @cooldown = cooldown @last = (Time.now - cooldown) @cache = {} @mtimes = {} @reload_mutex = Mutex.new extend backend end
def reload!(stderr = $stderr)
def reload!(stderr = $stderr) rotation do |file, mtime| previous_mtime = @mtimes[file] ||= mtime safe_load(file, mtime, stderr) if mtime > previous_mtime end end
def safe_load(file, mtime, stderr = $stderr)
def safe_load(file, mtime, stderr = $stderr) load(file) stderr.puts "#{self.class}: reloaded `#{file}'" file rescue LoadError, SyntaxError => ex stderr.puts ex ensure @mtimes[file] = mtime end