garbage collection - Protect pointers on minor heap during callback from C -


मेरे पास ऐसा परिदृश्य है जहां सी-लाइब्रेरी एक फ्लोट एआरए को तर्क के रूप में लेता है और (कहीं आगे सड़क के नीचे) एक OCaml फ़ंक्शन कॉल करता है:

  ------------- | ए) ओकैमल | P: मान (फ्लोट एरे) ------------- || \ / --------- | बी) सी | पी: डबल * --------- || \ / ------------ | सी) ओकैमल | पी: वैल्यू (फ्लोट एरे) ------------  

ओसीएमएल के चालाक स्मृति लेआउट के कारण, कोई भी value < / कोड> सी-लाइब्रेरी और सब कुछ-अभी-कार्य (टीएम) में एक डबल * के रूप में। यही है, जब तक कि भाग में कुछ आवंटन हो रहा है c)।

जब जीसी मामूली ढेर को साफ करने का निर्णय करता है, तो डबल * पॉइंटर अमान्य हो सकता है चूंकि यह केवल मापदंडों में हो सकता है b), मैं जीसी को संकेत देता हूं "जो भी आप चाहते हैं, लेकिन इन ब्लॉकों में सामग्री को तब तक नहीं ले जायें जब तक कि मैं आपको ऐसा न कहूं"। क्या इसको ओकैमल एपीआई का उपयोग करने का एक तरीका है?

इस समस्या को हल करने के लिए एक बड़ाअरा उचित तरीका होगा, लेकिन इसका मतलब यह है कि आप केवल सी से ओकैमल के लिए डबल * पॉइंटर, आपको कस्टम ब्लॉक का ट्रैक रखना होगा जो कि बैटरर्र को दर्शाता है।

एक और तरीका है, हालांकि यह कम सुरुचिपूर्ण और कम मजबूत है: आप यह सुनिश्चित कर सकते हैं कि फ्लोट एआरए निम्न में से दोनों को आगे बढ़ने से आगे नहीं बढ़ता है:

  1. आवंटित होने के बाद कुछ बिंदु पर एक छोटी संग्रह करने के लिए मजबूर करें (कॉल < कोड> जी.सी.एम <)
  2. प्रतिबन्धित संकायों ( Gc.set का उपयोग करने के लिए max_overhead से 1000000)

Comments

Popular posts from this blog

asp.net - Procedure or function "Procedure name" expects a parameter "Param name" which was not supplied occurs rarely -

c# - The item with identity 'Id' already exists in the metadata collection. Parameter name: item -

c++ - Redefined variable in the other module -