Установление связи с кодом, который называет избранным ()

Я пишу Хаскеллу, связывающему с некоторыми библиотека и есть функция пустота foo() , который звонит избранный() внутри. Когда я вызываю эту функцию от Хаскелла, тот избранный () , требование начинает постоянно возвращаться EINTR . Это путает код библиотеки, и он начинает перекручивание навсегда.

В #haskell канал IRC мне сказали бежать foo() от связанной нити. Я использовал runInBoundThread для этого, и теперь все, кажется, работает. Но в некоторых редких случаях я добираюсь Будильник сообщение в пульте ( хорошо, я нашел, что это означает, что приложение ловит SIGALRM ).

Я не уверен, что это - надлежащий способ решить эту проблему, и я не хочу зависеть от Контроль. Параллелизм . Что я должен сделать?

5
добавлено отредактировано
Просмотры: 1
de
Я слышу, что GHC использует SIGALRM и SIGVTALRM внутренне для управления потоком. Если иностранная кодовая нить чувствительна к этим сигналам, необходимо заблокировать их для той нити. Посмотрите, например, withRTSSignalsBlocked из База данных. HDBC.MySQL.RTS .
добавлено автор n.m., источник
Контроль. Параллельный часть стандартной библиотеки - в зависимости от него, совпадает с в зависимости от haskell. Почему don' t вы хотите использовать тот модуль? (хотя я признаю, что сигнальные сообщения странные, I' ve, никогда замечаемый это)
добавлено автор luqui, источник

2 ответы

Причиной SIGALRM было использование GHC во время выполнения старого пути выполнения кода для руководящего материала таймера. Этот старый путь выполнения кода включал, потому что GHC's формирует сценарий, имел вид linuxism в его проверке на create_timer() функция. Фиксация его заставила GHC использовать тот же самый механизм, который используется на всех платформах и устранил рассматриваемую ошибку.

Relevant Phabricator Diff: https://phabricator.haskell.org/D831

2
добавлено

n.m.'s comment is correct: the code in withRTSSignalsBlocked will hide signals from your ffi'd code: http://hackage.haskell.org/packages/archive/HDBC-mysql/0.6.6.1/doc/html/Database-HDBC-MySQL.html#v:withRTSSignalsBlocked

Это должно также избавить от необходимости runInBoundThread, я думаю.

1
добавлено
Затем ясно, действие you' запрос ре охраняется withRTSSignalsBlocked isn' t один that' s порождение ошибки, или это делает что-то с ленивым IO так или иначе. т.е. блокирование работ сигналов, но they' ре, пойманное где-то в другом месте, чем в выполнении действия.
добавлено автор sclv, источник
withRTSSignalsBlocked акт = $ runInBoundThread. alloca \set-> делает... Хм... хорошо, i' ll пробуют его, тем не менее.
добавлено автор arrowd, источник
Этот didn' t помог мне. Если я удаляю runInBoundThread и pthread_sigmask запрос rhs наконец , это работает. Но it' s полностью неправильный поступок, если я понимаю его правильный.
добавлено автор arrowd, источник
Хорошо, i' ve, которыми заменяют, runInBoundThread с forkOS , удаленный второй pthread_unmask требование, и это работало. Это стоило мне способности получить возвращаемое значение иностранного требования, но меня don' t нужен он, к счастью. Однако, it' s sooo hackish):
добавлено автор arrowd, источник