test 5:
ソケットがノンブロッキングであることを忘れている場合に備えて、sendとrecvの呼び出しにMSG_DONTWAITを追加した。それでもうまくいかない場合の万全の対策として、別のスレッドがsend/recvスレッドを監視し、停止した場合に終了して再起動する。debug.logに「*** Restarting ThreadSocketHandler ***」と出力され、ステータスバーにしばらくエラーメッセージが表示される。
終了する前に、ハングしているソケットを閉じることを試みる。それがうまくいけば、スレッドの終了に頼る必要はない。
スレッドを約1000回終了させるテストを実行したが、問題なかったので安全なはずだ。Linux上での終了はpthread_cancelで、これによりC++の例外ハンドラに投げ込まれる。
使っていたスレッド呼び出しには終了機能がなかったので、util.hにWindowsではCreateThread、LinuxではNpthread_createを使用する独自のラッパーを作成した。以下の代わりに:
_beginthreadはWindows専用で終了機能なし
boost::threadは非常に魅力的だが終了機能なし
wxThreadは呼び出す可能性のある各関数にクラスを作成する必要がある(最悪)
ファイルは次のメールに添付する
出典:COPA対ライト裁判の証言の一環として、2024年2月にマルッティ・マルミによりGitHubで公開。完全な書簡アーカイブはmmalmi.github.io/satoshi/で閲覧可能。