mirror of
https://github.com/Insality/druid
synced 2025-06-27 10:27:48 +02:00
75 lines
1.3 KiB
Lua
75 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
|