2016-02-06 5 views
8

Ruby's callcc фиксирует текущее продолжение, которое впоследствии можно вызвать для восстановления элемента управления, но не для данных. Я хотел бы зафиксировать текущее продолжение вместе с текущим изображением памяти.Контрольная точка и восстановление кучи в Ruby

Мне кажется, что захват кучи не должен быть очень трудным; Я могу положиться на ObjectSpace::each_object и ObjectSpace::dump_all, или Marshal.dump, или просто Object.clone. Однако я не вижу прямого способа восстановить кучу. В идеале, я хотел бы пересечь карту object_id -> object, восстановив старое изображение объекта за каждые object_id (и повторное добавление object_id, если соответствующий объект был GC'd). Неудивительно, что на Api нет уровня Ruby, который позволяет мне это делать. Мне интересно, есть ли крючки низкого уровня для GC Ruby, которые я могу использовать.

Любая помощь приветствуется, включая предложения об альтернативных подходах.

ответ

1

Чтобы ответить на мой собственный вопрос, Process.fork может быть использована для более или менее добиться эффекта кучи контрольных точек и восстановление. Всякий раз, когда мне приходится проверять кучу, я развиваю новый процесс и позволяю ребенку продолжать. Родительский процесс теперь содержит кучу: контрольная точка

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 

настоящее время я использую это решение, и не возникало никаких проблем, так далеко. Я отредактирую этот ответ, если найду его в будущем.

Смежные вопросы