Rubys callcc
erfasst die aktuelle Fortsetzung, die anschließend aufgerufen werden kann, um das Steuerelement, aber nicht die Daten wiederherzustellen. Ich möchte die aktuelle Fortsetzung zusammen mit dem aktuellen Bild der Erinnerung erfassen.
Es scheint mir, dass die Erfassung des Heaps nicht sehr schwierig sein sollte; Ich kann mich auf ObjectSpace::each_object
und ObjectSpace::dump_all
oder Marshal.dump
oder einfach Object.clone
verlassen. Ich sehe jedoch keinen einfachen Weg, den Heap wiederherzustellen. Im Idealfall würde ich die object_id -> object
-Karte durchqueren und das alte Bild des Objekts für jedes object_id
wiederherstellen (und das object_id
erneut hinzufügen, wenn das entsprechende Objekt GC'd wurde). Es überrascht nicht, dass es keine Api-Version auf Ruby-Ebene gibt, die mir dies ermöglicht. Ich frage mich, ob es Low-Level-Hooks zu Rubys GC gibt, die ich verwenden kann.
Jede Hilfe wird geschätzt, einschließlich Vorschläge zu alternativen Ansätzen.
Um meine eigene Frage zu beantworten, kann Process.fork
verwendet werden, um mehr oder weniger den Effekt von Heap Checkpointing und Wiederherstellung zu erreichen. Immer wenn ich den Heap checken muss, mache ich einen neuen Prozess und lasse das Kind weitermachen. Der übergeordnete Prozess enthält jetzt den Checkpointed-Heap:
Wenn der Status wiederhergestellt werden muss, wird der untergeordnete Prozess einfach beendet:
%Vor%Ich verwende derzeit diese Lösung und habe bisher keine Probleme festgestellt. Ich werde diese Antwort bearbeiten, wenn ich in der Zukunft etwas finde.
Tags und Links ruby garbage-collection callcc