[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 メーリングリストの案内