2017-04-12 11 views
5

मैं नेटिवॉल इंटरफ़ेस के साथ काम कर रहा हूं।मैं नेटलकॉल कॉलबैक के माध्यम से एक पर्ल 6 ऑब्जेक्ट कैसे पास कर सकता हूं?

लाइब्रेरी मेरे कॉलबैक फ़ंक्शन को कई गुना कॉल करने जा रही है।

यह ठीक काम करता है। मैं सिर्फ हस्ताक्षर के साथ अपना कॉलबैक घोषित कर सकता हूं, इसे & कॉलबैक के रूप में पास कर सकता हूं और लाइब्रेरी उप सब ठीक कहती है।

इसमें कुछ भी पर पेलोड शून्य * सूचक सेट करने की क्षमता है, और इसमें मेरे कॉलबैक फ़ंक्शन को कॉल में शामिल किया जाएगा।

क्या मैं पर्ल स्ट्र को छुपा सकता हूं, उदाहरण के लिए, पेलोड में और सफलतापूर्वक यात्रा करने के लिए?

sub set_userdata(Pointer) returns int32 is native { ... } 

sub set_callback(&callback(Pointer $userdata --> int32)) returns int32 is native { ... } 

sub callback(Pointer $userdata) returns int32 { 
    my Str $mystring = ??? 
    ... 
} 

my Str $my-userdata-string; 

set_userdata(???); 
set_callback(&callback); 

ऐसा लगता है जैसे कि यह बाध्यकारी के कुछ मंत्र के साथ काम कर सकता है,, nativecast() और/या .deref "rw है।"

उत्तर

2

मुझे उपयोगकर्ताडाटा को अनदेखा करके और प्रत्येक कॉलबैक फ़ंक्शन के लिए सीधे पर्ल ऑब्जेक्ट का संदर्भ देने वाला एक नया बंद करने के द्वारा इसे प्राप्त किया गया। चूंकि मैंने कॉलबैक सेट करते समय हर बार एक नया बंद किया है, मुझे लगता है कि यह समय के साथ स्मृति को रिसाव करेगा।

+2

जोनाथन वर्थिंगटन एक बेहतर दृष्टिकोण के साथ आने के बावजूद, मुझे लगता है कि आपके प्रयास का एक संक्षिप्त उदाहरण इस जवाब में देखने के लिए अच्छा होगा, क्योंकि लोग आपके समाधान की योग्यता के बारे में चर्चा कर सकते हैं, और यदि यह वास्तव में स्मृति को रिसाव करता है। यह सब के बाद एक सीखने की साइट है। –

7

आप केवल ऐसे मामले में देशी प्रतिनिधित्व का उपयोग कर सकते हैं (जैसे CStruct, CArray, और CPointer), या वैकल्पिक रूप से Blob। आप यह सुनिश्चित करने के लिए भी ज़िम्मेदार हैं कि आप जिस चीज को userdata के रूप में पारित करते हैं, उसे पर्ल 6 के परिप्रेक्ष्य से भी जीवित रखें, इसलिए जीसी सी फंक्शन को पारित स्मृति को पुनः प्राप्त नहीं करता है।

मेमोरी प्रबंधन कारण है कि आप किसी भी पुराने पर्ल 6 ऑब्जेक्ट को सी फ़ंक्शन पर पास नहीं कर सकते हैं: जीसी को यह जानने का कोई तरीका नहीं है कि ऑब्जेक्ट अभी भी कुछ सी डेटा संरचना के माध्यम से पहुंच योग्य है या नहीं, यह आत्मनिरीक्षण नहीं कर सकता है। एक वीएम में जैसे MoarVM ऑब्जेक्ट्स कचरा संग्रह प्रक्रिया के हिस्से के रूप में समय के साथ स्मृति में चारों ओर स्थानांतरित हो जाते हैं, जिसका अर्थ है कि सी कोड एक आउट-डेटेड पॉइंटर के साथ समाप्त हो सकता है।

एक वैकल्पिक रणनीति बिल्कुल एक सूचक नहीं है, लेकिन इसके बजाय एक पूर्णांक पास करें और वस्तुओं का एक सरणी में अनुक्रमणित करने के लिए इसका उपयोग करें। (इस प्रकार मोरवीएम के अंदर लिब्यू बाध्यकारी वीएम-स्तरीय कॉलबैक को ट्रैक करता है, fwiw।)

+0

मुझे एक इंडेक्स का विचार एक स्थिर सरणी में पसंद है जिसे मैं पर्ल साइड पर प्रबंधित करता हूं। फिर एक कॉलबैक सिर्फ उस के साथ सही वस्तु को पकड़ सकता है। धन्यवाद! –

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

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