[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

error in w3m-process-kill-stray-processes (was: Error process-filter/sentinel when exec w3m-delete-buffer)



土屋です.

私の使い方だと,稀に w3m-process-kill-stray-processes() の中で

1:  (save-excursion
2:    (set-buffer (w3m-process-buffer obj))
3:    (dolist (x (w3m-process-handlers w3m-process-object))
4:      (unless (buffer-name (w3m-process-handler-parent-buffer x))
5:        (setq w3m-process-queue (delq obj w3m-process-queue))
6:        (when (w3m-process-process obj)
7:          (w3m-process-kill-process (w3m-process-process obj))))))

の第3行で,w3m-process-object が nil のためにエラーになります.

タイミングに依存しているみたいで,再現条件が今一つはっきりしないのですが,
C-u M-x w3m-antenna RET して reload 中に,w3m-open-all-links-in-new-session() 
で大量のタブを開き,開いたタブを適当に消そうとした時に起きます.

それで,w3m-process-kill-stray-processes() についての議論を遡ってみたとこ
ろ,

>> On Wed, 05 Nov 2003 12:46:30 +0900 (JST)
>> shirai@xxxxxxxxxxxxxxxxxxx (Hideyuki SHIRAI (白井秀行)) said as follows:

>mode-line に取得状況(?)を表示するようになってからだと思うのです
>が、まだ process が動いている *w3m* buffer で
>w3m-delete-buffer() などをすると、process の filter や sentinel
>でエラーが発生するので、

>	* w3m.el (w3m-delete-buffer, w3m-delete-other-buffers)
>	(w3m-select-buffer-delete-buffer): Call `w3m-process-stop'.

>としておきました。

>ここまでは問題ないと思うのですが、*w3m* buffer を直接
>kill-buffer したときもエラーしちゃまずいだろうということで、
>w3m-process-kill-stray-processes() という関数を作って迷子の
>process を kill するようにもしたのですが、少々自信がありません。

まで遡ってしまいました.

それで,コードを精査し直したのですが,第5行で他の handler の存在を気にせ
ずに delq してしまっているのは問題がありませんか? というわけで,

	* w3m-proc.el (w3m-process-kill-stray-processes): Do not kill
	process when the buffer associated to it is alive.
	(w3m-process-sentinel): Do not call a handler when its parent
	buffer have been killed.

という変更を加えました.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )