Как расширить объект состояния потока GHC
Я хотел бы добавить два дополнительных поля типа 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
Я предполагаю, что это должно быть с cmm
и/или деталями реализации STG (смещения генерируются, поскольку структуры не видны на уровне cmm
, исправьте меня, если я ошибаюсь). Значит ли порядок полей? Я пропустил файл, который нужно изменить?
Я использую отладочную сборку компилятора и RTS и довольно датированный ghc 6.12.3 в 64-битной архитектуре. Любые намеки на соответствующую документацию и комментарии
о разнице между ghc 6 и 7 относительно обработки TSO также приветствуются.
Ответы
Ответ 1
Обходной путь, который оказался для меня достаточно хорошим, заключался в том, чтобы ввести отдельную структуру данных для каждого Capability
, который будет содержать дополнительную информацию для каждой легкой нити. Я использовал отображение HashTable
(см. rts/Hash.h
и .c
) из идентификатора потока в пользовательскую структуру info. Записи были добавлены, когда потоки были созданы из искр (в schduleActiveteSpark
).
Сроки создания, ввода, поиска и уничтожения записей и таблицы показали незначительные накладные расходы для небольших программ. Основные накладные расходы обусловлены фактическим использованием информации и, в идеале, должны храниться вне самой внутренней схемы планировщика. Для сборки THREADED_RTS
необходимо обеспечить, чтобы другие возможности не обращались к таблицам, которые не являются их собственными (или используют mutex
, если такой доступ необходим, что является потенциальным источником дополнительных издержек).
Ответ 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, я получаю указанную вами ошибку, но если я делаю чистую сборку, тогда она компилируется просто отлично.