Как контролировать основной поток ОС в Haskell?

Я пытаюсь внедрить интерпретатор ruby1.9 в программу. В настоящее время я использую forkOS в моем пакете hruby, но, похоже, это работает только для ruby ​​1.8 и 2.x. Похоже, что 1.9 необходимо выполнить в основном потоке. Как сторона node, нет документации, как это сделать, поэтому единственный указатель на мою текущую проблему - здесь.

Есть ли способ взять под контроль основной поток для запуска всех моих вызовов FFI?

Ответ 1

Проведя некоторое тестирование и чтение документации, я пришел к следующим выводам. В отчете говорится, что все это определяется реализацией, поэтому нет стандартного способа. Модуль Control.Concurrent указывает в своей документации, что main является связанным потоком, однако он не требует, чтобы он был таким же, как и основной поток ОС.

Экспериментально (по крайней мере, на Linux 64-бит с GHC 7.8 и 7.10-rc3) основным потоком является поток ОС. Учитывая, что основной поток связан, кажется, что на других платформах GHC не было бы причин для других, но я не могу тестировать другие платформы.

С точки зрения фактического осуществления этого, если вы хотите запрограммировать так, как если бы ruby ​​был в другом потоке, вы можете запускать большинство нерубинных материалов в другом потоке и общаться с основным потоком (который говорит с интерпретатором ruby) через либо MVar или TVar s. См. Комментарий от @chi для примера того, как это делается в gtk.

В терминах интерфейса библиотеки вы можете иметь функцию инициализации, которая принимает продолжение. Ваша библиотека захватывает поток при инициализации, а затем вызывает продолжение в другом потоке. Конечно, вам нужно документировать для пользователей, что он должен быть вызван в основном потоке.