5

私はいくつかのライブラリへのHaskellバインディングを書いています、そしてその中void foo()に呼び出す関数がありますselect()。Haskellからこの関数を呼び出すと、そのselect()呼び出しは常に戻り始めEINTRます。これはライブラリコードを混乱させ、永久にループを開始します。

#haskellIRCチャネルでは、バインドされたスレッドから実行するように指示されていますfoo()。私はこれに使用runInBoundThreadしましたが、今ではすべてが機能しているようです。しかし、まれAlarm clockにコンソールにメッセージが表示されることがあります(わかりました、アプリがSIGALRMをキャッチすることを意味します)。

この問題を処理する適切な方法がわからないので、に依存したくありませんControl.Concurrency。私は何をすべきか?

4

2 に答える 2

2

SIGALRMの原因は、タイマー関連の管理に古いコードパスを使用したGHCのランタイムでした。この古いコードパスは、GHCのconfigureスクリプトの機能チェックに一種のLinuxismが含まれていたためにオンになりましたcreate_timer()。これを修正すると、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 に答える