mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Merge pull request #1143 from hwhw/master
Fix cache implementation, pull blitbuffer fix
This commit is contained in:
2
base
2
base
Submodule base updated: 6e399d6474...d271522ae9
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user