2010-11-03 16 views
7

मेरा होस्ट सी एप्लिकेशन, जो लुआ दुभाषिया को एम्बेड करता है, को सूचित किया जाना चाहिए कि लुआ लिपि चलाने में कुछ वस्तु/तालिका कचरा एकत्रित है, इसलिए यह कुछ करेगा , फ़ाइल को लॉग इन करने के लिए इस घटना को रिकॉर्ड करें। मैं उसे कैसे कर सकता हूँ?ऑब्जेक्ट/टेबल कचरा एकत्रित होने पर होस्ट एप्लिकेशन को सूचित करने के लिए कैसे करें

उत्तर

12
userdata करने के लिए एक metatable जोड़ने और metatable के लिए एक "__gc" समारोह जोड़कर

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 

सी कोड बना सकते हैं और एक userdata ऑब्जेक्ट में एक metatable जोड़ने के लिए: लुआ तालिकाओं का कचरा संग्रहण का पता लगाने के

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

एक तरीका यह है कि तालिका में एक कनारी userdata वस्तु को जोड़ने के लिए है

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

समाधान im वर्तमान में उपयोग कर thats। सोचा कि एक बेहतर है। बीटीडब्ल्यू इस न्यूप्रोक्सी (सच) क्या है? – Vertilka

+0

newproxy (सत्य) - एक उपयोगकर्ता डेटा वस्तु (आकार = 0 के साथ) और एक मेटाटेबल बनाता है। यह लुआ की एक गैर-दस्तावेज विशेषता है। आप इसके बारे में यहां और अधिक पढ़ सकते हैं: http://lua-users.org/wiki/HiddenFeatures – Neopallium

संबंधित मुद्दे