我想在线程状态对象(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之间的差异也是受欢迎的。
答案 0 :(得分:2)
您获得的错误来自:ghc/rts/sm/Scav.c
。特别是在第1917行:
default:
barf("scavenge_stack: weird activation record found on stack: %d", (int)(info->i.type));
您似乎还需要修改ClosureTypes.h
,ghc/includes/rts/storage
。此文件似乎包含可以出现在堆对象中的不同类型的标头。我也遇到了一些奇怪的bootstrapping错误,如果我尝试使用stage-1编译器重建,我会得到你提到的错误,但如果我做了一个干净的构建,那么它编译得很好。
答案 1 :(得分:1)
对我来说足够好的解决方法是为每个Capability
引入一个单独的数据结构,用于保存每个轻量级线程的附加信息。我使用了HashTable
(请参阅rts/Hash.h
和.c
)从线程ID到自定义信息结构的映射。从sparks(schduleActiveteSpark
)创建线程时添加了条目。
创建,插入,查找和销毁条目和表的时间显示小程序的开销可以忽略不计。主要开销是由信息的实际使用产生的,理想情况下应该保留在最里面的调度程序循环之外。对于THREADED_RTS
构建,需要确保其他功能不访问不属于自己的表(如果需要此类访问,则使用mutex
,这可能是额外开销的原因)。