mirror of https://github.com/lua/lua.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
680 B
41 lines
680 B
4 years ago
|
-- track collections
|
||
|
|
||
|
local M = {}
|
||
|
|
||
|
-- import list
|
||
|
local setmetatable, stderr, collectgarbage =
|
||
|
setmetatable, io.stderr, collectgarbage
|
||
|
|
||
|
_ENV = nil
|
||
|
|
||
|
local active = false
|
||
|
|
||
|
|
||
|
-- each time a table is collected, remark it for finalization on next
|
||
|
-- cycle
|
||
|
local mt = {}
|
||
|
function mt.__gc (o)
|
||
|
stderr:write'.' -- mark progress
|
||
|
if active then
|
||
|
setmetatable(o, mt) -- remark object for finalization
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
function M.start ()
|
||
|
if not active then
|
||
|
active = true
|
||
|
setmetatable({}, mt) -- create initial object
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
function M.stop ()
|
||
|
if active then
|
||
|
active = false
|
||
|
collectgarbage() -- call finalizer for the last time
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return M
|