5

我正在编写一个与某些库的 Haskell 绑定,并且有一个在内部void foo()调用的函数select()。当我从 Haskell 调用此函数时,该select()调用开始不断返回EINTR。这会混淆库代码并开始永远循环。

#haskellIRC 频道中,我被告知foo()要从绑定线程中运行。我已经习惯runInBoundThread了,现在一切似乎都正常了。但在极少数情况下,我会Alarm clock在控制台中收到消息(好的,我发现这意味着应用程序捕获了 SIGALRM)。

我不确定这是处理这个问题的正确方法,我不想依赖Control.Concurrency. 我应该怎么办?

4

2 回答 2

2

SIGALRM的原因是 GHC 的运行时使用旧代码路径来管理计时器内容。这个旧的代码路径正在打开,因为 GHC 的配置脚本在其create_timer()功能检查中具有某种 linux 主义。修复它使 GHC 使用在所有平台上使用的相同机制,并消除了有问题的错误。

相关 Phabricator 差异:https ://phabricator.haskell.org/D831

于 2016-03-09T07:45:52.470 回答
1

nm 的评论是正确的:中的代码withRTSSignalsBlocked将隐藏您的 ffi 代码中的信号:http://hackage.haskell.org/packages/archive/HDBC-mysql/0.6.6.1/doc/html/Database-HDBC-MySQL 。 html#v:withRTSSignalsBlocked

我认为这也应该消除对 runInBoundThread 的需要。

于 2012-12-29T01:10:07.027 回答