2016-02-06 12 views
8

में ढेर को बहाल करें रूबी का callcc वर्तमान निरंतरता को कैप्चर करता है, जिसे बाद में नियंत्रण बहाल करने के लिए कहा जा सकता है, लेकिन डेटा नहीं। मैं स्मृति की वर्तमान छवि के साथ वर्तमान निरंतरता को पकड़ना चाहता हूं।चेकपॉइंट और रूबी

ऐसा लगता है कि ढेर को पकड़ना बहुत मुश्किल नहीं होना चाहिए; मैं ObjectSpace::each_object और ObjectSpace::dump_all, या Marshal.dump पर भरोसा कर सकता हूं, या बस Object.clone पर भरोसा कर सकता हूं। हालांकि, मुझे ढेर को बहाल करने के लिए कोई सीधा तरीका नहीं दिख रहा है। आदर्श रूप से, मैं object_id -> object मानचित्र को पार करना चाहता हूं, प्रत्येक object_id (और object_id को फिर से जोड़कर, यदि संबंधित ऑब्जेक्ट जीसी किया गया था) के लिए ऑब्जेक्ट की पुरानी छवि को पुनर्स्थापित करना है। अनजाने में, कोई रूबी-स्तर एपीआई नहीं है जो मुझे ऐसा करने देता है। मैं सोच रहा हूं कि रुबी के जीसी में कोई निम्न स्तर के हुक हैं जो मैं उपयोग कर सकता हूं।

वैकल्पिक दृष्टिकोण के बारे में सुझाव सहित किसी भी मदद की सराहना की जाती है।

उत्तर

0

प्रत्येक को स्टैक पर धक्का देने के बारे में कैसे? फिर आप डेटा पुनर्प्राप्त करने के लिए स्टैक को पॉप-अप कर सकते हैं।

https://github.com/bvsatyaram/Ruby-Data-Structures

1

अपने ही सवाल का जवाब करने के लिए, Process.fork अधिक या कम ढेर checkpointing और बहाली के प्रभाव को प्राप्त करने के लिए इस्तेमाल किया जा सकता है। जब भी मुझे ढेर की जांच करनी पड़ती है, मैंने एक नई प्रक्रिया काटा और बच्चे को जारी रखने दिया।

def checkpoint 
    if Process.fork.nil? then # if child, then resume execution immediately 
    return 
    else # if parent, wait for the child to exit. 
    Process.wait 
    end 
    return # Parent now resumes execution from state it was in before forking. 
end 

जब राज्य पुनर्स्थापित करने के लिए किया गया है, बच्चे प्रक्रिया बस बाहर निकालता है:

def restore 
    Process.exit 
end 

मैं वर्तमान में इस समाधान का उपयोग कर रहा है, और इसलिए किसी भी समस्याओं का सामना नहीं किया है माता पिता की प्रक्रिया अब checkpointed ढेर शामिल दूर। अगर मुझे भविष्य में कोई मिल जाए तो मैं इस जवाब को संपादित कर दूंगा।

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