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

jev*_*jev 13 haskell runtime-error ghc c-minus-minus

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

 internal error: scavenge_stack: weird activation record found on stack: 45
Run Code Online (Sandbox Code Playgroud)

我想它必须使用cmm和/或STG实现细节(因为结构在cmm级别上不可见而产生偏移,如果我错了就纠正我).字段的顺序是否重要?我错过了一个应该更改的文件吗?

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

jev*_*jev 1

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

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