@ -66,7 +66,32 @@ function Cache:new(o)
return o
end
-- internal: remove reference in cache_order list
function Cache : _unref ( key )
for i = # self.cache_order , 1 , - 1 do
if self.cache_order [ i ] == key then
table.remove ( self.cache_order , i )
end
end
end
-- internal: free cache item
function Cache : _free ( key )
if not self.cache [ key ] then return end
self.current_memsize = self.current_memsize - self.cache [ key ] . size
self.cache [ key ] : onFree ( )
self.cache [ key ] = nil
end
-- drop an item named via key from the cache
function Cache : drop ( key )
self : _unref ( key )
self : _free ( key )
end
function Cache : insert ( key , object )
-- make sure that one key only exists once: delete existing
self : drop ( key )
-- guarantee that we have enough memory in cache
if ( object.size > self.max_memsize ) then
DEBUG ( " too much memory claimed for " , key )
@ -76,9 +101,7 @@ function Cache:insert(key, object)
-- (they are at the end of the cache_order array)
while self.current_memsize + object.size > self.max_memsize do
local removed_key = table.remove ( self.cache_order )
self.current_memsize = self.current_memsize - self.cache [ removed_key ] . size
self.cache [ removed_key ] : onFree ( )
self.cache [ removed_key ] = nil
self : _free ( removed_key )
end
-- insert new object in front of the LRU order
table.insert ( self.cache_order , 1 , key )
@ -94,11 +117,7 @@ function Cache:check(key, ItemClass)
if self.cache [ key ] then
if self.cache_order [ 1 ] ~= key then
-- put key in front of the LRU list
for k , v in ipairs ( self.cache_order ) do
if v == key then
table.remove ( self.cache_order , k )
end
end
self : _unref ( key )
table.insert ( self.cache_order , 1 , key )
end
return self.cache [ key ]