class Rack::Reloader
High performant source reloader
This class acts as Rack middleware.
What makes it especially suited for use in a production environment is that any file will only be checked once and there will only be made one system call stat(2).
Please note that this will not reload files in the background, it does so only when actively called.
It is performing a check/reload cycle at the start of every request, but also respects a cool down time, during which nothing will be done.
Public Class Methods
# File lib/rack/reloader.rb, line 25
def initialize(app, cooldown = 10, backend = Stat)
@app = app
@cooldown = cooldown
@last = (Time.now - cooldown)
@cache = {}
@mtimes = {}
@reload_mutex = Mutex.new
extend backend
end Public Instance Methods
# File lib/rack/reloader.rb, line 36
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 # File lib/rack/reloader.rb, line 50
def reload!(stderr = $stderr)
rotation do |file, mtime|
previous_mtime = @mtimes[file] ||= mtime
safe_load(file, mtime, stderr) if mtime > previous_mtime
end
end # File lib/rack/reloader.rb, line 58
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 A safe Kernel::load, issuing the hooks depending on the results
© 2007-2021 Leah Neukirchen
Licensed under the MIT License.