[mew-win32 4466] Re: MasterPW に C-g 連打で固まる

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
2008年 1月 15日 (火) 18:37:06 JST


From: Kazu Yamamoto (山本和彦) <kazu at example.com> さん曰く
Subject: [mew-win32 4465] Re: MasterPW に C-g 連打で固まる
Message-ID: <20080115.120022.11587387.kazu at example.com>
Date: Tue, 15 Jan 2008 12:00:22 +0900 (JST)

> > (1) mew-rendezvous() で待っているとき C-g で抜けた場合の対処
> 
> このマクロなんですが、
> 
> mew-ssh/ssl で
> 	(mew-rendezvous (null (mew-ssl-get-status pnm)))
> としているために、setq できません。

すいません。気づきませんでした。

> やるとしたら、
> 
> (condition-case nil
>     (mew-rendezvous mew-passwd-rendezvous)
>   (quit (setq mew-passwd-rendezvous nil)))
> 
> ぐらいではないでしょうか?
> 
> そもそも、C-g したときに sentinel は呼ばれませんか?
> 呼ばれるなら、この処理は不要ですね?
> sentinel で set-buffer しないだけで十分ですね?

これがねぇ、原因が判らないから、なにをすれば OK?というのも判ら
ないのですよ。試しに

(defun mew-passwd-load ()
 ....
	      (condition-case nil
		  (mew-rendezvous mew-passwd-rendezvous)
		(quit (setq mew-passwd-rendezvous nil)
		      (if (and (processp pro) (memq pro '(run stop)))
			  (kill-process pro))))

に加えて

(defun mew-passwd-sentinel (process event)
  (setq mew-passwd-rendezvous nil))

なものをやってみたのですが、gpg のプロセスが残って Meadow 100%
が発生しました。NG。

	      (condition-case nil
		  (mew-rendezvous mew-passwd-rendezvous)
		(quit (setq mew-passwd-rendezvous nil)))
              (if (and (processp pro) (memq pro '(run stop)))
			  (kill-process pro))

これだと、gpg のプロセスは無くて Meadow 100% になるので NG。

それぞれ、めちゃくちゃ C-g 連打!という通常はやらないテストです
が、結構高確率で NG になります。

> 試す環境がないので、試して頂けると嬉しいです。

結局、なんでかはわからないのですが、ぼくの手元の Meadow だと、
inhibit-quit & quit-flag で制御しないと固まるようです。

各種 UNIX ではあまり試せていませんが、quit-flag => t になると、
sentinel でのプロセスバッファがすでになくなっているのは確認しま
した。もうちょい試してみます。

-- 
白井秀行 (mailto:shirai at example.com)

Index: mew-passwd.el
===================================================================
RCS file: /cvsmew/mew/mew-passwd.el,v
retrieving revision 1.12
diff -u -r1.12 mew-passwd.el
--- mew-passwd.el	25 Jul 2007 06:06:59 -0000	1.12
+++ mew-passwd.el	15 Jan 2008 09:31:51 -0000
@@ -154,6 +154,15 @@
 ;;; Load and save
 ;;;
 
+(defmacro mew-passwd-rendezvous ()
+  `(let ((inhibit-quit t))
+     (setq mew-passwd-rendezvous t)
+     (while mew-passwd-rendezvous
+       (sit-for 0.1)
+       ;; accept-process-output or sleep-for is not enough
+       (discard-input)
+       (if quit-flag (setq mew-passwd-rendezvous nil)))))
+
 (defun mew-passwd-load ()
   (let ((process-connection-type mew-connection-type2)
 	(file (expand-file-name mew-passwd-file mew-conf-path))
@@ -169,8 +178,7 @@
 			 "-d" "--yes" "--output" tfile file))
 	      (set-process-filter   pro 'mew-passwd-filter)
 	      (set-process-sentinel pro 'mew-passwd-sentinel)
-	      (setq mew-passwd-rendezvous t)
-	      (mew-rendezvous mew-passwd-rendezvous)
+	      (mew-passwd-rendezvous)
 	      (when mew-passwd-master
 		(let ((coding-system-for-read 'undecided))
 		  (insert-file-contents tfile))
@@ -204,8 +212,7 @@
 			 "--yes" "--output" file tfile))
 	      (set-process-filter   pro 'mew-passwd-filter)
 	      (set-process-sentinel pro 'mew-passwd-sentinel)
-	      (setq mew-passwd-rendezvous t)
-	      (mew-rendezvous mew-passwd-rendezvous)
+	      (mew-passwd-rendezvous)
 	      (if (file-exists-p file) (throw 'loop nil))
 	      (setq i (1+ i)))
 	    (message "Master password is wrong! Passwords not saved")
@@ -242,9 +249,7 @@
 	(setq mew-passwd-rendezvous nil))))))
 
 (defun mew-passwd-sentinel (process event)
-  (save-excursion
-    (set-buffer (process-buffer process))
-    (setq mew-passwd-rendezvous nil)))
+  (setq mew-passwd-rendezvous nil))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;



Mew-win32 メーリングリストの案内