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

Re: Error process-filter/sentinel when exec w3m-delete-buffer



>> On Fri, 07 Nov 2003 10:17:31 +0900
>> 「土」== tsuchiya@pine.kuee.kyoto-u.ac.jp (TSUCHIYA Masatoshi) said as follows:

土> experimental-async 枝の非同期プロセス周辺には,まだ大きな穴が開い
土> ているはずなんです.

どうやら,w3m-process-with-wait-handler で非同期プロセスの終了待ちをし
ている時,データの末尾が挿入されるよりも前に,終了したと判断してしまっ
ていたようです.

問題を再現するためのコードを以下に示します.

    (with-temp-buffer
      (set-buffer-multibyte nil)
      (let* ((coding-system-for-read 'binary)
             (file (expand-file-name "/etc/passwd"))
             (proc (start-process "cat" (current-buffer) "cat" file)))
        (while (eq 'run (process-status proc))
          (accept-process-output nil 0 200))
        (= (buffer-size)                  ; 取り込まれたデータの量
           (nth 7 (file-attributes file)) ; 実際のファイルサイズ
           )))                            ; 本当は一致して t になるはず
    => nil

cat したデータの末尾を取り込み損ねていて,実際のファイルよりもデータが
少なくなってしまっていることが分かります.

色々試したのですが,以下のように「データが得られなくなり,更にプロセス
が終了状態になるまで待つ」ように修正すると,ほぼ確実に終了待ちできるよ
うになりました.

    (with-temp-buffer
      (set-buffer-multibyte nil)
      (let* ((coding-system-for-read 'binary)
             (file (expand-file-name "/etc/passwd"))
             (proc (start-process "cat" (current-buffer) "cat" file)))
        (while (or (accept-process-output proc 0 0)
                   (eq 'run (process-status proc))))
        (= (buffer-size) (nth 7 (file-attributes file)))))
    => t

ただ,ここら辺の処理がうまく動くかどうかは,かなり環境に依存するような
ので,更にテストが必要です.Meadow / XEmacs / Mule などの他の Emacsen 
を利用されている方,また,Mac OS X や OS/2 などの他の OS を利用されて
いる方の追試をお願いします.

確認の手順ですが,最初に,以下のコマンドを実行して experimental-async 
枝に移動してください.

    % cvs update -r experimental-async

その上で,上述の検証用コードや,以下の検証用コードが正しく処理されるこ
とを確認してください.

    (w3m-process-with-wait-handler
      (w3m-process-do-with-temp-buffer
          (type (w3m-retrieve "http://emacs-w3m.namazu.org/" nil t nil nil handler))
        (w3m-process-do
            (type (w3m-retrieve "http://emacs-w3m.namazu.org/" nil t nil nil handler))
          (buffer-size))))
    => 30456

また,shimbun を利用している場合は,複数の記事を連続して閲覧してみて,
尻切れとんぼになっている記事がないか調べてみてください.

終了後,CVS の幹の先端に戻るには,

    % cvs update -A

としてください.

;; 私自身は,ここ1週間ほど experimental-async 枝で暮しています.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )