[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: start-process



From: TSUCHIYA Masatoshi <tsuchiya@pine.kuee.kyoto-u.ac.jp> さん曰く
Subject: [emacs-w3m:00426] start-process
Message-ID: <mpa66gnl6kj.fsf@azalea.kuee.kyoto-u.ac.jp>
Date: 02 Apr 2001 23:28:12 +0900

土> 非同期プロセスの問題は、実は Windows に限ったことではなく、Unix 環境で
土> もかなり簡単に deadlock を引き起こすことが出来るみたいですね。

## ちなみに、Meadow + process + process からの dial-up の問題は
## start-process だけじゃなくて call-process でも起るので、この
## 土屋さんの話とは、また別の話です。^^;;;

土> 例えば、私の環境は Emacs-20.7 + Solaris-2.6 ですが、以下のコードを評価
土> すると90%くらいの確率で見事に固まってしまいます。

土>     (with-temp-buffer
土>       (let* ((process-connection-type t)
土>              (proc (start-process "*w3m*"
土>                                   (current-buffer)
土>                                   "w3m" "-dump_source" "http://namazu.org/")))
土>         (message "%d" (process-id proc))
土>         (while (eq (process-status proc) 'run)
土>           (accept-process-output proc 5))
土>         (process-exit-status proc)))

Emacs-21 だと全然固まらないけど、Emacs-20.7 だとあっさり固まりま
すね。Solaris 7。(20.7 な Meadow は大丈夫だけど)

土> というように accept-process-output の引数を変更すると、何故か動くよう
土> になります。

土> ## これは、おそらく Emacs のバグなんでしょうねえ…

かもしれないですね。

土> そこで、以下のように w3m-exec-process を変更しようかと考えているのです
土> が、Windows 環境ではどうなるか調べていただけないでしょうか。特に、
土> accept-process-output の第3引数が有効になるのか否かが気になります。

大丈夫です。動きます。

だけど、

土>           (accept-process-output proc 5))
土>           (accept-process-output proc 0 200))

この秒数の差で問題が出るなら、sentinel を使った方が良いんじゃ無
いでしょうか?

(defvar w3m-process nil)
(defvar w3m-process-status nil)
(make-variable-buffer-local 'w3m-process)
(make-variable-buffer-local 'w3m-process-status)

(defun w3m-process-sentinel (proc event)
  (when (buffer-name (process-buffer proc))
    (save-excursion
      (set-buffer (process-buffer proc))
      (setq w3m-process-status (process-exit-status w3m-process))
      (setq w3m-process nil))))
  
(with-temp-buffer
  (let ((process-connection-type t))
    (setq w3m-process-status nil)
    (setq w3m-process
	  (start-process "*w3m*"
			 (current-buffer)
			 "w3m" "-dump_source" "http://namazu.org/"))
    (set-process-sentinel w3m-process 'w3m-process-sentinel)
    (message "%d" (process-id w3m-process))
    (while w3m-process
      (sit-for 0.5)
      (discard-input))
    w3m-process-status))

な感じ。過去、ちゃんと動いている start-process で sentinel を取
り損なった経験はないと思いましたです。

# しかし、私の XEmacs だと process-connection-type を nil にしな
# いと終りがわからない。。。

ので、お次の話は(いつ書けるかわからないけど)違うメールで。。。

-- 
白井秀行 (mailto:shirai@rdmg.mgcs.mei.co.jp)