Extension-Druid/druid/system/tablepool.lua
2022-04-05 18:57:40 +03:00

76 lines
1.3 KiB
Lua

-- Source: https://github.com/openresty/lua-tablepool/blob/master/lib/tablepool.lua
local setmetatable = setmetatable
local _M = {}
local max_pool_size = 500
local pools = {}
function _M.fetch(tag)
local pool = pools[tag]
if not pool then
pool = {}
pools[tag] = pool
pool.c = 0
pool[0] = 0
else
local len = pool[0]
if len > 0 then
local obj = pool[len]
pool[len] = nil
pool[0] = len - 1
return obj
end
end
return {}
end
function _M.release(tag, obj, noclear)
if not obj then
error("object empty", 2)
end
local pool = pools[tag]
if not pool then
pool = {}
pools[tag] = pool
pool.c = 0
pool[0] = 0
end
if not noclear then
setmetatable(obj, nil)
for k in pairs(obj) do
obj[k] = nil
end
end
do
local cnt = pool.c + 1
if cnt >= 20000 then
pool = {}
pools[tag] = pool
pool.c = 0
pool[0] = 0
return
end
pool.c = cnt
end
local len = pool[0] + 1
if len > max_pool_size then
-- discard it simply
return
end
pool[len] = obj
pool[0] = len
end
return _M