/usr/lib/ruby/vendor_ruby/innate/lru_hash.rb is in ruby-innate 2013.02.21-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | module Innate
# A Hash-alike LRU cache that provides fine-grained control over content
# restrictions.
#
# It allows you to set:
# * a maximum number of elements
# * the maximum amount of memory used for all elements
# * the allowed memory-size per element
# * time to live
#
# Differences to the original implementation include:
# * The Cache is now a Struct for speed
#
# Copyright (C) 2002 Yoshinori K. Okuji <okuji@enbug.org>
# Copyright (c) 2009 Michael Fellinger <manveru@rubyists.com>
#
# You may redistribute it and/or modify it under the same terms as Ruby.
class LRUHash < Struct.new(:max_count, :expiration, :hook, :objs, :list)
CacheObject = Struct.new(:content, :size, :atime)
# On 1.8 we raise IndexError, on 1.9 we raise KeyError
KeyError = Module.const_defined?(:KeyError) ? KeyError : IndexError
include Enumerable
def initialize(options = {}, &hook)
self.max_count = options[:max_count]
self.expiration = options[:expiration]
self.hook = hook
self.objs = {}
self.list = []
end
def delete(key)
return unless objs.key?(key)
obj = objs[key]
hook.call(key, obj.content) if hook
objs.delete key
list.delete_if{|list_key| key == list_key }
obj.content
end
def clear
objs.each{|key, obj| hook.call(key, obj) } if hook
objs.clear
list.clear
end
alias invalidate_all clear
def expire
return unless expiration
now = Time.now.to_i
list.each_with_index do |key, index|
break unless (objs[key].atime + expiration) <= now
delete key
end
end
def [](key)
expire
return unless objs.key?(key)
obj = objs[key]
obj.atime = Time.now.to_i
list.delete_if{|list_key| key == list_key }
list << key
obj.content
end
def []=(key, obj)
expire
delete key if objs.key?(key)
delete list.first if max_count && max_count == list.size
objs[key] = CacheObject.new(obj, size, Time.now.to_i)
list << key
obj
end
end
end
|