2012年11月3日土曜日

pselectの罠


XBeeからの通信とsocketからのコマンド通信、iRemoconとの通信の応答、アメッシュ監視processからの通信を待つためにpselectを使用していたのですが、OSXはrace conditonがあるようではまってしまいました。
たまに時間指定で開くはずのシャッターが開かなかったりしていたので、仕込みを入れて追っていたのですがようやく原因にたどり着きました。

pselectの通信待ちの間にtimer eventを受けるためにsetitimerでSIGALRM通知を受けているのですが、タイミングによってはpselectから戻って来ません。
仕込みを入れてみるとsigactionで設定しているhandlerには飛んでいるのですが、pselectがblockしたままになっているケースがありました。
pselectがatomicにできていないようで、SIGALRMを受けるタイミングがうまく合ってしまうと判別できないことがあるようです。

ネットで検索してみるとよく知られている現象のようで、selfpipeでhandlerからselectの監視portにnonblock ioでwriteすることで通知することで回避できるようです。
直したところ取りこぼすことがなくなりました。

0 件のコメント:

コメントを投稿