我正在编写一个Haskell绑定到某个库,并且有一个函数void foo()
,它在里面调用select()
。当我从Haskell调用此函数时,select()
调用开始不断返回EINTR
。这会混淆库代码,并且它会永远开始循环。
在#haskell
IRC频道中,我被告知从绑定线程运行foo()
。我已经使用了runInBoundThread
,现在一切似乎都有效。但在极少数情况下,我在控制台中收到Alarm clock
消息(好的,我发现这意味着应用程序捕获SIGALRM )。
我不确定这是解决此问题的正确方法,我不想依赖Control.Concurrency
。我该怎么办?
答案 0 :(得分:2)
SIGALRM 的原因是GHC的运行时使用旧的代码路径来管理计时器内容。这个旧的代码路径正在启动,因为GHC的配置脚本在检查create_timer()
函数时有一些linuxism。修复它使GHC使用与所有平台上使用的机制相同的机制,并消除了有问题的错误。
相关的Phabricator Diff:https://phabricator.haskell.org/D831
答案 1 :(得分:1)
n.m.的评论是正确的:withRTSSignalsBlocked
中的代码会隐藏您的ffi代码中的信号:http://hackage.haskell.org/packages/archive/HDBC-mysql/0.6.6.1/doc/html/Database-HDBC-MySQL.html#v:withRTSSignalsBlocked
我认为这也应该消除了对runInBoundThread的需求。