从C调用Haskell导出时垃圾收集器何时运行?

时间:2015-02-11 21:44:48

标签: haskell garbage-collection ghc ffi

当导出要从C调用的Haskell函数时,何时收集Haskell的垃圾?如果C拥有main,则无法预测下一次调用Haskell。在运行单线程Haskell或没有并行GC时,这个问题尤为重要。

1 个答案:

答案 0 :(得分:3)

初始化ghc运行时时,可以通过argc和argv like so将rts标志传递给它:

  RtsConfig conf = defaultRtsConfig;
  conf.rts_opts_enabled = RtsOptsAll;
  hs_init_ghc(&argc, &argv, conf);

这使您set options可以修复较小的最大堆大小,或者在托儿所上使用压缩算法来进一步减少分配。此外,请注意,有一个空闲GC,其间隔可以设置(或禁用),如果链接线程运行时,无论您是否回退到Haskell调用,都应该运行。

编辑:我实际上没有进行过实验来验证以下内容,但如果我们查看source of hs_init_ghc,我们会看到它初始化信号处理程序,其中应包含{ {3}}响应SIGVTALRM,实际上它也会启动时间,调用(在POSIX上)timer handlers应该定期抛出这些信号。反过来,这定期应该唤醒&#34; RTS是否发生了任何事情,这反过来意味着它将运行空闲GC,无论系统是否从C回收到Haskell。但是,我再次阅读代码和评论,而不是自己测试。< / p>