class DTAS::Mcache

Public Class Methods

new(shift = 8, ttl = 60) click to toggle source
# File lib/dtas/mcache.rb, line 8
def initialize(shift = 8, ttl = 60)
  @mask = (1 << shift) - 1
  @ttl = ttl
  @tbl = []
end

Public Instance Methods

lookup(infile) { |infile, cur| ... } click to toggle source
# File lib/dtas/mcache.rb, line 14
def lookup(infile)
  bucket = infile.hash & @mask
  st = nil
  if cur = @tbl[bucket]
    if cur[:infile] == infile && (DTAS.now - cur[:btime]) < @ttl
      begin
        st = File.stat(infile)
        return cur if cur[:ctime] == st.ctime
      rescue
      end
    end
  end
  return unless block_given?
  @tbl[bucket] = begin
    cur = cur ? cur.clear : {}
    begin
      st ||= File.stat(infile)
      cur[:ctime] = st.ctime
    rescue
      return
    end
    if ret = yield(infile, cur)
      ret[:infile] = infile.frozen? ? infile : -(infile.dup)
      ret[:btime] = DTAS.now
    end
    ret
  end
end