11.3 【謎が解けた】
しばらく家に帰ると疲れて「ばたっ」という生活をしていたので更新できず。だいぶ慣れてきてもう大丈夫なのだけど、プログラムのバグがいろいろ見つかってその修正にもおわれていた。やっとひと段落ついたようなのでその報告など。
まず、Phut。Phutを終了した時にフリーズしてしまうという症状が報告された。うちではそれらしいことは一度も起こっていないのだが、フリーズするというからにはなにか問題があるに違いない。
プログラムを一通りチェックしてみても問題になりそうな場所は見つからず、アプリケーションの組み合わせが問題なのかとフリーズに関係したらしいソフトをダウンロードしてチェックしてみたがこれも問題なし。と、ふと、8.27に書いたメモリリークの事が気にかかる。
メモリリークがあると書いたにもかかわらず、結局原因がわからずに今までそのままになっていた。たった300バイト程度だから気にすることはないかと思ったからなのだが、今思えばやはりもう少しちゃんとチェックしておくべきだったか。
これがフリーズの原因だという確信はないが、ハンドルの内容が妙に気になる。ファイルのリソースフォークの内容と見比べてみると、ちょうどファイルの一番最後の部分とほぼ一致しているのだ。これは、リソースマップなのか?
最初から何バイト目かのところにアドレスらしきものがあって、それが指しているアドレスが指しているアドレス(要はハンドルってこと)をダンプしてみると、別のパレットのデータが出てきた。ふむ。さらに、そのアドレスらしきもののあとにある2バイトは、ファイルを開いていた時のリファレンスナンバだった。
しかしファイル自体は正しく閉じられているようで、MacsBugで「files」と入力してみてもリストには出てこない。それに、閉じたパレットをResEditで開けば正常に開けるのだから問題はないはず。んー、リソースマップのように見えるのは気のせいなのか???
FSpOpenResFile()の数やUseResFile()で正しくカレントリソースファイルを変更できているかもチェックしてみたがそれも問題ない。つくりかけの時は保存の前にファイルを閉じて作り直すというややこしいことをしていたがそれももう問題ないはずだし……。
と、ふと、「パレットを閉じる」と注釈が書かれたToolboxをダブルクリックしてCmd+E、Cmd+Gを押してみる。あ、あれ? 初期設定ファイルとかを閉じる時にも使っているはずなのにおかしいな。あ、ああ!? FSClose()ってなんだ。リソースファイルならCloseResFile()で閉じないといけないんじゃないのか?
たったそれだけの変更で、今まで悩まされ続けてきた問題が何事もなかったかのように解決した。そうか、それでリソースマップだけが残っていたのか……。状況から冷静に考えれば気がつきそうなことだった。うむむ。
とりあえず教訓は「リソースファイルはCloseResFile()で閉じる」かな(んなこと当たり前だって(笑))。
他にもバグがあったのでそのあたりも修正して1.15b1をリリース。1.15にしてもよかったのだけど、フリーズ問題がこれで解決すればそのまま1.15にすると。解決しなければさらにもうしばらく検討してからにすると。そういう感じ。
|