如何在对象/表被垃圾回收时通知主机应用程序

时间:2010-11-03 18:57:30

标签: c object lua garbage-collection lua-table

我的主机 C 应用程序,嵌入了一个Lua解释器,需要通知运行Lua脚本中的某个对象/表是垃圾收集的,所以它会做一些事情,比如记录这个事件来记录文件。我怎么能这样做?

1 个答案:

答案 0 :(得分:12)

通过向userdata添加metatable并向metatable添加“__gc”函数。

In Lua 5.1, only userdata has support for the "__gc" methamethod.

检测Lua表的垃圾收集的一种方法是在该表中添加一个canary userdata对象:

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

用于创建和添加metatable到用户数据对象的C代码:

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. */
}