I am writing a module for Lua. On closing the lua interpreter it must run clean up routines even if user forgets to call shutdown routine implicitly.
The module is mostly written in C.
What callback in Lua C Api should I use to detect end of program execution? The only idea I have come with is using __gc metamethod on table representing my module. Any ideas?
From a C module, the simple thing to do is to create a full
userdata
with ametatable
with a__gc
metamethod. Store it in a field in the module's environment so it isn't collected by the GC until the module is unloaded.According to the manual, only
userdata
get their__gc
metamethod called by the collector, so you can't use a table to hold the module's finalizer.For a module written in pure Lua that needs a finalizer, you still need to have a
userdata
to hold it up. The unsupported and undocumented but widely known functionnewproxy()
can be used to create an otherwise emptyuserdata
with a metatable to use for this purpose. Call it asnewproxy(true)
to get one with a metatable, and usegetmetatable()
to retrieve the metatable so you can add the__gc
metamethod to it.