Cómo notificar aplicación host cuando el objeto / tabla se recogen basura
-
28-09-2019 - |
Pregunta
Mi anfitrión C aplicación, que incrustar un intérprete de Lua, debe ser notificado de que cierto objeto / tabla en el funcionamiento de Lua script se recoge la basura, por lo que va a hacer algo, como registro de este evento en el registro archivo. ¿Cómo puedo hacer eso?
Solución
mediante la adición de un metatabla a la userdata y la adición de una función de "__gc" al metatabla.
En Lua 5.1, solamente datos de usuario tiene soporte para el "__gc" methamethod.
Una forma de detectar la recolección de basura de tablas Lua es agregar un objeto de datos de usuario canario en dicho cuadro:
function create_canary(tab)
local canary=newproxy(true)
local meta=getmetatable(canary)
meta.__gc = function() print("Canary is died:", tab) end
tab[canary] = canary
end
código C para crear y añadir un metatabla a un objeto de datos de usuario:
static int userdata_gc_method(lua_State *L) {
UserObj *ud = lua_touserdata(L, 1);
/* TODO: do something */
return 0;
}
static int create_userdata_obj(lua_State *L) {
UserObj *ud = lua_newuserdata(L, sizeof(UserObj));
/* TODO: initialize your userdata object here. */
lua_newtable(L); /* create metatable. */
lua_pushliteral(L, "__gc"); /* push key '__gc' */
lua_pushcfunction(L, userdata_gc_method); /* push gc method. */
lua_rawset(L, -3); /* metatable['__gc'] = userdata_gc_method */
lua_setmetatable(L, -2); /* set the userdata's metatable. */
return 1; /* returning only the userdata object. */
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow