2011-12-06 18 views
8

मैं रूबी एक्सटेंशन और Im फ़ंक्शन Data_wrap_struct का उपयोग कर लिख रहा हूं।Data_wrap_struct और मार्क फ़ंक्शन

रुबी के मार्क-एंड-स्वीप कचरा संग्रहण प्रक्रिया में भाग लेने के लिए, मुझे अपनी संरचना को मुक्त करने के लिए एक दिनचर्या परिभाषित करने की आवश्यकता है, और मेरी संरचना से किसी भी संदर्भ को अन्य संरचनाओं में चिह्नित करने के लिए एक दिनचर्या की आवश्यकता है। मैं स्मृति को मुक्त करने के लिए क्लासिक free फ़ंक्शन पास करता हूं लेकिन मुझे नहीं पता कि मार्क फ़ंक्शन का उपयोग कैसे करें।

मेरी structs इस

typedef struct 
{ 
    int x; 
    int y; 
} A; 

typedef struct 
{ 
    A collection[10]; 
    int current; 
} B; 

की तरह ध्वनि मुझे लगता है कि मैं कैसे एक निशान समारोह को देखने के लिए struct बी के collection में संदर्भ

किसी ने मुझे एक उदाहरण दिखा सकते हैं चिह्नित करने के लिए एक निशान समारोह की जरूरत है काम करता है?

उत्तर

6

मार्क फ़ंक्शन का उपयोग किसी भी रूबी ऑब्जेक्ट्स को चिह्नित करने के लिए किया जाता है जो आपकी सी संरचना का मालिक है।

typedef struct { 
    VALUE ruby_object; 
} MyStruct; 

void mark(void * p) { 
    /* p is the wrapped pointer to the MyStruct instance */ 
    MyStruct * my_struct = (MyStruct *) p; 
    rb_gc_mark(my_struct->ruby_object); 
} 

अपने संरचना के स्वामित्व वस्तु चिह्नित नहीं है, तो यह कचरा कलेक्टर स्वीप कर सकता है और अपने कोड एक को अंतिम रूप दिया वस्तु का उपयोग करने की कोशिश कर रहा हो सकता है।

+1

क्या मुझे अन्य रूबी ऑब्जेक्ट्स द्वारा संदर्भित गैर-रूबी ऑब्जेक्ट्स को चिह्नित करने की आवश्यकता है? मेरे मामले में मेरे पास अन्य रूबी वर्गों (उनके संदर्भों के साथ) द्वारा बनाए गए विगेट्स का पेड़ है। – lzap

+0

@Izap, नहीं। 'मार्क' फ़ंक्शन का उपयोग रुबी के कचरा कलेक्टर को ** रूबी ऑब्जेक्ट्स ** के बारे में बताने के लिए किया जाता है जो रूबी वर्चुअल मशीन, जैसे सी एक्सटेंशन के बाहरी कोड से बनाए गए थे। यदि आपके हाथों में रूबी ऑब्जेक्ट है जो अन्य मूल गैर-रूबी ऑब्जेक्ट्स बनाता है, तो आप रूबी ऑब्जेक्ट कचरा इकट्ठा होने के बाद संसाधनों को रिलीज़ करने के लिए 'फ्री' फ़ंक्शन को कार्यान्वित करना चाहेंगे। –