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

start-process



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

例えば、私の環境は 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)))

評価中に ps でプロセスを探してみたのですが、何処にも見つかりませんでし
たから、終了したプロセスの出力を延々と待機しているというのが真相のよう
です。

それで少し小細工をして、

    (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 0 200))
        (process-exit-status proc)))

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

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

そこで、以下のように w3m-exec-process を変更しようかと考えているのです
が、Windows 環境ではどうなるか調べていただけないでしょうか。特に、
accept-process-output の第3引数が有効になるのか否かが気になります。
Index: w3m.el
===================================================================
RCS file: /storage/cvsroot/emacs-w3m/w3m.el,v
retrieving revision 1.169
diff -u -u -r1.169 w3m.el
--- w3m.el	2001/04/02 04:38:13	1.169
+++ w3m.el	2001/04/02 14:05:39
@@ -1327,24 +1327,21 @@
 		(w3m-process-user-counter 2)
 		(proc (apply 'start-process w3m-command (current-buffer) w3m-command args)))
 	    (set-process-filter proc 'w3m-exec-filter)
-	    (set-process-sentinel proc (lambda (proc event) nil))
+	    (set-process-sentinel proc 'ignore)
 	    (process-kill-without-query proc)
             (unwind-protect
-                (progn
-                  (while (eq (process-status proc) 'run)
-                    (if (functionp w3m-process-message)
-                        (funcall w3m-process-message))
-                    (sleep-for 0.2)
-                    (discard-input))
-                  (prog1 (process-exit-status proc)
-                    (and w3m-current-url
-                         w3m-process-user
-                         (setq w3m-arrived-user-list
-                               (cons
-                                (cons w3m-current-url
-                                      (list w3m-process-user w3m-process-passwd))
-                                (delete (assoc w3m-current-url w3m-arrived-user-list)
-                                        w3m-arrived-user-list))))))
+                (prog2
+		    (while (eq (process-status proc) 'run)
+		      (accept-process-output nil 0 200))
+		    (process-exit-status proc)
+		  (and w3m-current-url
+		       w3m-process-user
+		       (setq w3m-arrived-user-list
+			     (cons
+			      (cons w3m-current-url
+				    (list w3m-process-user w3m-process-passwd))
+			      (delete (assoc w3m-current-url w3m-arrived-user-list)
+				      w3m-arrived-user-list)))))
               (delete-process proc)));; Clean up resources of process.
 	;; call-process
 	(apply 'call-process w3m-command nil t nil args)))))
@@ -1406,7 +1403,9 @@
 	      (condition-case nil
 		  (process-send-string process
 				       (concat w3m-process-user "\n"))
-		(error nil)))))))))
+		(error nil))))))
+	(if (functionp w3m-process-message)
+	    (funcall w3m-process-message)))))
 
 
 ;;; Handle character sets:
なお、上記の変更を行っても固まってしまう場合は、

    (setq w3m-process-connection-type nil)

という設定を考慮してみてください。多分、認証を必要とするページは読めな
くなると思いますが、全てのページが固まるよりはましでしょう。

-- 
土屋 雅稔  ( TSUCHIYA Masatoshi )
    http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/