Using the C API,
you can set garbage-collector metamethods for userdata (see §2.8).
These metamethods are also called finalizers.
Finalizers allow you to coordinate Lua's garbage collection
with external resource management
(such as closing files, network or database connections,
or freeing your own memory).
Garbage userdata with a field __gc in their metatables are not
collected immediately by the garbage collector.
Instead, Lua puts them in a list.
After the collection,
Lua does the equivalent of the following function
for each userdata in that list:
function gc_event (udata)
local h = metatable(udata).__gc
if h then
h(udata)
end
end
At the end of each garbage-collection cycle,
the finalizers for userdata are called in reverse
order of their creation,
among those collected in that cycle.
That is, the first finalizer to be called is the one associated
with the userdata created last in the program.
The userdata itself is freed only in the next garbage-collection cycle. |