このサイトで公開しているRSSリーダー Heimdallr ですが、既知のバグが1件あります。最新の情報に更新する処理が永遠に終わらなくなるバグです。CPU使用率が100%になるのが特徴です。
発生頻度が低く、OSはWinXP Home、登録サイト数は200、更新間隔は30分という条件で、一週間に一度発生するかしないかくらいの頻度です。
おかげでバグ解析が難航しています。まだ原因は分かっていません。
原因は分かっていませんが、なんとなくMFCのCInternetSession、CHttpConnection、CHttpFileあたりの使い方が悪いのではないかと考えています。
HeimdallrではこれらのクラスをRSS Feedを取得するために使っており、その中で受信タイムアウトを実現するために以下の処理を行っています。
最後のAbort呼び出しを別スレッドから行っているのが問題で、このような使い方をした場合、正しく動作することが保障されるとはどこにも明記されていないのです。よって、何か問題が発生する可能性もあります。でも再現性が低いため本当にこれが原因なのか確認できていないのです。さてはて・・・。
投稿者 MASATO : 2006年05月03日 19:54 | トラックバックCHttpFile::Abortが内部で呼んでいるInternetCloseHandleはスレッドセーフであることがドキュメントに明記されていました。後はCHttpFile自身がスレッドセーフであれば良いと思い、inet.cppを眺めていたところ、CHttpFileスレッドセーフではないものの、今のHeimdallrの使い方ではギリギリ問題がない気配・・・。もしかしてこの記事に書いてあることは全て私の勘違いかもしれません。
レスポンスを返さないHTTPサーバーについてはテスト済なので問題はないと思います。
一番怪しいのがレスポンスボディ取得中のAbortではないかとみています。十分にテストされていませんし、複雑なので。
レスポンスを返さないHTTPサーバーを用意して
タイムアウトスレッドからCHttpFile::Abortを呼び出すのを連打してみるとかではダメですかね?