13

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

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

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

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

4

2 回答 2

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. 该文件似乎包含可以出现在堆对象中的不同类型的标头。我还遇到了一些奇怪的引导错误,如果我尝试使用 stage-1 编译器进行重建,我会得到你提到的错误,但如果我进行干净的构建,那么它编译得很好。

于 2015-06-26T17:44:15.420 回答
1

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

对条目和表的创建、插入、查找和销毁进行计时表明小程序的开销可以忽略不计。主要开销来自信息的实际使用,理想情况下应该保持在最里面的调度程序循环之外。对于THREADED_RTS构建,需要确保其他 Capabilities 不会访问不属于他们自己的表(或者mutex如果需要此类访问,则使用 a,这是额外开销的潜在来源)。

于 2015-08-01T18:53:24.163 回答