8

Rubycallcc捕获当前的延续,随后可以调用它来恢复控件,但不能恢复数据。我想捕捉当前的延续以及内存的当前图像。

在我看来,捕获堆应该不是很困难。我可以依赖ObjectSpace::each_objectand ObjectSpace::dump_all, or Marshal.dump,或者只是简单Object.clone的 。但是,我没有看到任何直接的方法来恢复堆。理想情况下,我想遍历object_id -> object 地图,为每个对象恢复旧图像object_id(并重新添加object_id相应对象是否已被 GC'd)。不出所料,没有 Ruby 级别的 api 可以让我这样做。我想知道是否有任何我可以使用的 Ruby GC 的低级钩子。

感谢您提供任何帮助,包括有关替代方法的建议。

4

2 回答 2

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

我目前正在使用这个解决方案,到目前为止还没有遇到任何问题。如果将来找到任何答案,我将编辑此答案。

于 2016-02-11T17:54:54.480 回答
0

将每个推入堆栈怎么样?然后你可以继续从堆栈中弹出来检索数据。

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

于 2016-02-10T15:15:06.667 回答