Merge pull request #1143 from hwhw/master

Fix cache implementation, pull blitbuffer fix
pull/1144/head
Huang Xin 10 years ago
commit af504707f2

@ -1 +1 @@
Subproject commit 6e399d64748e1f138bb2073fb77c127a0d3ff86d
Subproject commit d271522ae91a225be42be747f9add3e0227f003c

@ -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]

Loading…
Cancel
Save