[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Error process-filter/sentinel when exec w3m-delete-buffer
>> On Wed, 05 Nov 2003 12:46:30 +0900 (JST)
>> 「白井」== shirai@rdmg.mgcs.mei.co.jp (Hideyuki SHIRAI (白井秀行)) said as follows:
白井> まだ 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'.
白井> としておきました。
この件ですが,もしかしたら experimental-async 枝では,
2003-11-07 TSUCHIYA Masatoshi <tsuchiya@namazu.org>
* w3m-proc.el (w3m-process-do-with-temp-buffer): Keep the current
buffer after given FORM and BODY are evaluated.
この変更で緩和されるかもしれません.
w3m-process-do-with-temp-buffer に大穴が開いていて,一時バッファを利用
した処理の後,残っている handler が呼出し時の buffer で処理されること
が保証されていませんでした.動作確認している暇がとれないので commit は
していませんが,CVS HEAD 用に殴り書きしたパッチを末尾に添付しておきま
す.
ただ,experimental-async 枝の非同期プロセス周辺には,まだ大きな穴が開
いているはずなんです.例えば,
(w3m-process-with-wait-handler
(w3m-process-do-with-temp-buffer
(type (w3m-retrieve "http://emacs-w3m.namazu.org/" nil t nil nil handler))
(w3m-process-do
(type (w3m-retrieve "http://emacs-w3m.namazu.org/" nil t nil nil handler))
(buffer-size))))
を評価すると,毎回違う値が返ってきてしまいます.本当は,30012 になるは
ずなんですが.
[注] CVS HEAD 版では,繰り返して呼び出された非同期プロセスの終了待ちは
できません.
;; 本日の現実逃避は,これにて終了.
--
土屋 雅稔 ( TSUCHIYA Masatoshi )
--- w3m-proc.el 5 Nov 2003 12:40:28 -0000 1.36
+++ w3m-proc.el 7 Nov 2003 01:02:12 -0000
@@ -441,34 +441,43 @@
(let ((var (or (car spec) (gensym "--tempvar--")))
(form (cdr spec))
(this-handler (gensym "--this-handler--"))
- (temp-buffer (gensym "--temp-buffer--")))
+ (temp-buffer (gensym "--temp-buffer--"))
+ (current-buffer (gensym "--current-buffer--")))
`(let ((,this-handler handler)
(,temp-buffer
(w3m-get-buffer-create
- (generate-new-buffer-name w3m-work-buffer-name))))
- (labels ((post-body (,var handler ,temp-buffer)
+ (generate-new-buffer-name w3m-work-buffer-name)))
+ (,current-buffer (current-buffer)))
+ (labels ((post-body (,var handler ,temp-buffer ,current-buffer)
(unwind-protect
- (with-current-buffer ,temp-buffer
+ (progn
+ (when (buffer-name ,temp-buffer)
+ (set-buffer ,temp-buffer))
,@body)
- (w3m-kill-buffer ,temp-buffer)))
- (post-handler (,var handler ,temp-buffer)
+ (w3m-kill-buffer ,temp-buffer)
+ (when (buffer-name ,current-buffer)
+ (set-buffer ,current-buffer))))
+ (post-handler (,var handler ,temp-buffer ,current-buffer)
(unless (w3m-process-p
(setq ,var (post-body ,var handler
- ,temp-buffer)))
+ ,temp-buffer
+ ,current-buffer)))
(funcall (or handler (function identity))
,var))))
(let ((,var
(let ((handler
(list 'lambda (list ',var)
(list 'post-handler ',var
- ,this-handler ,temp-buffer))))
+ ,this-handler ,temp-buffer
+ ,current-buffer))))
(with-current-buffer ,temp-buffer ,@form))))
(if (w3m-process-p ,var)
(if ,this-handler
,var
(w3m-process-start-process ,var))
(if (w3m-process-p
- (setq ,var (post-body ,var ,this-handler ,temp-buffer)))
+ (setq ,var (post-body ,var ,this-handler
+ ,temp-buffer ,current-buffer)))
(if ,this-handler
,var
(w3m-process-start-process ,var))