Подтвердить что ты не робот

Как расширить объект состояния потока 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 также приветствуются.

4b9b3361

Ответ 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, я получаю указанную вами ошибку, но если я делаю чистую сборку, тогда она компилируется просто отлично.