7
我的主機C需要通知嵌入Lua解釋器的應用程序需要通知運行Lua腳本中的某個對象/表被垃圾收集,因此它會執行一些操作,就像將此事件記錄到日誌文件一樣。我怎樣才能做到這一點?如何在垃圾收集對象/表格時通知主機應用程序
我的主機C需要通知嵌入Lua解釋器的應用程序需要通知運行Lua腳本中的某個對象/表被垃圾收集,因此它會執行一些操作,就像將此事件記錄到日誌文件一樣。我怎樣才能做到這一點?如何在垃圾收集對象/表格時通知主機應用程序
通過向用戶數據添加metatable並向metatable添加「__gc」函數。
In Lua 5.1, only userdata has support for the "__gc" methamethod.
一個檢測Lua中的表的垃圾收集的方法是添加一個金絲雀用戶數據對象到該表中:
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代碼創建和一個元表添加到用戶數據對象:
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. */
}
這就是目前使用的解決方案。認爲有更好的一個。順便說一句,這是什麼新的代理(真)? – Vertilka 2010-11-04 18:07:56
newproxy(true) - 創建一個userdata對象(size = 0)和一個metatable。這是Lua未記錄的功能。你可以在這裏閱讀更多關於它的信息:http://lua-users.org/wiki/HiddenFeatures – Neopallium 2010-11-05 01:19:57