При экспорте функции Haskell для вызова из C, когда собирается мусор Haskell? Если C владеет main
, то невозможно предсказать следующий вызов Haskell. Этот вопрос особенно актуален при запуске однопоточного Haskell или без параллельного GC.
Когда запускается сборщик мусора при вызове экспорта Haskell из C?
Ответы (1)
Когда вы инициализируете среду выполнения ghc
, вы можете передать ей флаги rts через argc и argv вот так:
RtsConfig conf = defaultRtsConfig;
conf.rts_opts_enabled = RtsOptsAll;
hs_init_ghc(&argc, &argv, conf);
Это позволяет вам установить параметры, чтобы, например, зафиксировать меньший максимальный размер кучи или использовать алгоритм уплотнения в питомнике для дальнейшего сокращения распределения. Кроме того, обратите внимание, что существует бездействующий GC, интервал которого можно установить (или отключить), и если вы свяжете многопоточную среду выполнения, она должна работать независимо от того, вернетесь ли вы к вызову Haskell или нет.
Изменить. На самом деле я не проводил экспериментов, чтобы проверить следующее, но если мы посмотрим на источник hs_init_ghc мы видим, что он инициализирует обработчики сигналов, которые должны включать в себя обработчики таймеров, которые реагируют на SIGVTALRM
и действительно запускают время, которое вызывает (в POSIX) timer_create
, который должен подавать эти сигналы через равные промежутки времени. В свою очередь, это должно периодически «будить» RTS независимо от того, происходит что-либо или нет, что, в свою очередь, должно означать, что он будет запускать бездействующий сборщик мусора независимо от того, уступит ли система обратно Haskell из C. Но опять же, я только прочитал код и комментарии, сам не проверял.
performGC
перед возвратомAddr
. - person Cirdec   schedule 12.02.2015Addr
? - person Elliot Cameron   schedule 12.02.2015performGC
из C. - person chi   schedule 12.02.2015FunPtr
иStablePtr
. Когда вы делаетеStablePtr
илиFunPtr
, создаются новые корни GC, которые существуют до тех пор, пока они не будут освобождены. - person Cirdec   schedule 12.02.2015