[Mew-dist 15614] kill-emacs-hook
Tak Ota
Takaaki.Ota at example.com
2000年 12月 24日 (日) 05:38:53 JST
b91 にしてから奇妙な現象に悩まされました。といっても b90 に比べて変化
していない部分が原因のように思えて今一つ釈然としていません。現象として
は Emacs を終了しようとすると nil function, 3 is not a function などと
いったランダムな原因でエラーが発生します。debug-on-error: t だと最後は
run-hooks(kill-emacs-hook) でエラーが発生しています。現在 mew 関係では
以下の関数が kill-emacs-hook に登録されています。
mew-pop-clean-up (mew-pop.el)
mew-addrbook-clean-up (mew-addrbook.el)
mew-refile-clean-up (mew-refile.el)
mew-folder-clean-up (mew.el)
mew-mark-clean-up (mew-mark.el)
mew-temp-dir-clean-up (mew.el)
これらの関数はその中から remove-hook で自分自身を kill-emacs-hook から
detach するようになっています。( mew-pop-clean-up は自分じゃなくて他
人をはずすようになってますけど)
それぞれの hook 関数を edebug したりしていたのですが皆目何が変なエラー
を引き起こすのか分りませんでした。
そこでふと疑問に感じ始めたことがあります。hook 関数の中から
remove-hook ( add-hook も同じ)を使うことはその安全性が保証されている
のでしょうか?実際には run-hooks の実装がどうなっているかに依存すると
思いますがルールとしてはどうなっているのかが知りたく Elisp Manual をぺ
らぺらと探したのですが結局この件に関して「安全だからやってもよい、危険
だからやるな」という definitive な記述は見付けられませんでした。普通は
リストを辿ってループを回している最中にそのリスト自身に操作を加えること
は危険ですよね。
とりあえず上記6個の hook 関数から remove-hook の部分を削除してみると
問題は無くなりました。でも上記 hook 関数は全て b90 と殆ど変っておらず
(mew-pop-clean-up のバグも同じ)なぜ b91 になってから問題が顕在化して
きたのか不明です。
Mew-dist メーリングリストの案内