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