[Date Prev][Date Next][Thread Prev][][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))