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

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
2008年 1月 11日 (金) 14:34:27 JST


白井です。

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

> > まず、 .emacs 中に以下の 2行がある場合のみ発生する様です。
> >
> > (setq visible-bell t)
> > (setq mw32-visible-bell-type 'x)  ;; X-Window 版 Emacs 風の描画設定
> >
> > 両方コメントアウトした場合も、2行目だけコメントアウトした場合も発生しな
> > い様です。
>
> この件は、Meadow のバグということで、忘れることにします。

これ、Meadow 固有の現象だとするとプログラムを start-process して
そのプロセスが生きている間に、関連付けられているバッファ(今回は
with-temp-buffer)が消えちゃったとき、なぜだか CPU 100% になっちゃ
うことがよくある。。。という話なのですが、いろいろと実験したので
話の蒸し返し。

試したところ、

(setq visible-bell t)

で、C-g 連打だと Solaris や Zarus で使っている Emacs CVS Head で
も Emacs が暴走することがありました。頻度は Meadow で実験したと
きよりもめちゃくちゃ低いですが、症状は同じものだと思います。

# いままで visible-bell => nil で生活してきたし、こういう状況で
# C-g 連打って、まずやらないので、master passwd 入力以外ではどう
# なるのか?などは判りません。

でもって、visible-bell の処理は xterm.c, (Meadowの)mw32term.c,
macterm.c で全然違う処理をしているので、かずさんが使っている
Mac では発生しないとか。。。

この現象が visible-bell が t というのがトリガになっているかどう
かは今一不明ですが、以下のパッチでとりあえずは大丈夫みたいです。

(1) mew-rendezvous() で待っているとき C-g で抜けた場合の対処
(2) mew-passwd-sentinel() で、mew-passwd-rendezvous は
    buffer-local じゃないので、set-buffer() をやめた。
   => C-g 連打で結構エラーになる。with-temp-buffer を抜けてから
      sentinel が来るのかな?
(3) (ほとんど)Meadow のために process を kill するようにした。

です。理由ははっきりしないのですが、ぼくが実験した限りでは大丈夫
そうなので、追試募集です。

--
白井秀行 (mailto:shirai at example.com)
-------------- next part --------------
Index: mew-func.el
===================================================================
RCS file: /cvsmew/mew/mew-func.el,v
retrieving revision 1.190
diff -u -r1.190 mew-func.el
--- mew-func.el	7 Jan 2008 08:19:39 -0000	1.190
+++ mew-func.el	11 Jan 2008 05:27:30 -0000
@@ -1529,14 +1529,17 @@
 (defun mew-redraw (&optional time)
   (sit-for (or time 0)))
 
-(defmacro mew-rendezvous (who)
+(defmacro mew-rendezvous (who &optional iquit)
   ;; Wait for the termination of WHO.
   ;; Emacs does not provide synchronize mechanism with
   ;; an asynchronous process. So, take this way. 
-  `(while ,who
-     (sit-for 0.1)
-     ;; accept-process-output or sleep-for is not enough
-     (discard-input)))
+  `(let ((inhibit-quit ,iquit))
+     (while ,who
+       (sit-for 0.1)
+       ;; accept-process-output or sleep-for is not enough
+       (discard-input)
+       (when (and inhibit-quit quit-flag)
+	 (setq ,who nil)))))
 
 (defun mew-let-user-read ()
   (sit-for 1.5))
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	11 Jan 2008 05:27:30 -0000
@@ -170,7 +170,9 @@
 	      (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-rendezvous mew-passwd-rendezvous 'inhibit-quit)
+	      (if (and (processp pro) (memq pro '(run stop)))
+		  (kill-process pro))
 	      (when mew-passwd-master
 		(let ((coding-system-for-read 'undecided))
 		  (insert-file-contents tfile))
@@ -205,7 +207,9 @@
 	      (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-rendezvous mew-passwd-rendezvous 'inhibit-quit)
+	      (if (and (processp pro) (memq pro '(run stop)))
+		  (kill-process pro))
 	      (if (file-exists-p file) (throw 'loop nil))
 	      (setq i (1+ i)))
 	    (message "Master password is wrong! Passwords not saved")
@@ -242,9 +246,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 メーリングリストの案内