Когда сборщик мусора запускается при вызове экспорта Haskell из C?

При экспорте функции Haskell, которая вызывается из C, когда собирает сборщик Haskell? Если C принадлежит main, тогда невозможно предсказать следующий вызов в Haskell. Этот вопрос особенно важен при запуске однопоточного Haskell или без параллельного GC.

Ответ 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, которые должны периодически передавать эти сигналы. В свою очередь, это периодически должно "просыпаться" в РТС независимо от того, происходит ли что-либо или что-то происходит, что в свою очередь должно означать, что он будет запускать бездействующий GC, вернется ли система обратно к Haskell от C. Но опять же, я только прочитал код и комментарий, не проверял это сам.