与调用select()的代码连接

时间:2012-12-28 08:15:39

标签: haskell signals ffi

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

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

我不确定这是解决此问题的正确方法,我不想依赖Control.Concurrency。我该怎么办?

2 个答案:

答案 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的需求。