如何扩展GHC的线程状态对象

时间:2015-04-13 14:19:48

标签: haskell runtime-error ghc c-minus-minus

我想在线程状态对象(TSO)中添加两个类型为StgWord32的额外字段。基于我在GHC-Wiki上找到的信息以及查看源代码,我在/includes/rts/storage/TSO.h中扩展了结构并更改了创建不同偏移的程序(创建DerivedConstants.h)。编译器,rts和一个简单的应用程序重新编译,但在执行结束时(在hs_exit_中)垃圾收集器抱怨:

 internal error: scavenge_stack: weird activation record found on stack: 45

我想它必须与cmm和/或STG实现细节(由于结构在cmm级别不可见而生成偏移,如果我错了,请纠正我)。字段的顺序是否重要?我错过了一个应该更改的文件吗?

我在64位架构上使用编译器和RTS的 debug 版本以及相当过时的 ghc 6.12.3 。任何相关文档和评论的提示 关于TSO处理的ghc 6和7之间的差异也是受欢迎的。

2 个答案:

答案 0 :(得分:2)

您获得的错误来自:ghc/rts/sm/Scav.c。特别是在第1917行:

 default:
    barf("scavenge_stack: weird activation record found on stack: %d", (int)(info->i.type));

您似乎还需要修改ClosureTypes.hghc/includes/rts/storage。此文件似乎包含可以出现在堆对象中的不同类型的标头。我也遇到了一些奇怪的bootstrapping错误,如果我尝试使用stage-1编译器重建,我会得到你提到的错误,但如果我做了一个干净的构建,那么它编译得很好。

答案 1 :(得分:1)

对我来说足够好的解决方法是为每个Capability引入一个单独的数据结构,用于保存每个轻量级线程的附加信息。我使用了HashTable(请参阅rts/Hash.h.c)从线程ID到自定义信息结构的映射。从sparks(schduleActiveteSpark)创建线程时添加了条目。

创建,插入,查找和销毁条目和表的时间显示小程序的开销可以忽略不计。主要开销是由信息的实际使用产生的,理想情况下应该保留在最里面的调度程序循环之外。对于THREADED_RTS构建,需要确保其他功能不访问不属于自己的表(如果需要此类访问,则使用mutex,这可能是额外开销的原因)。