[Date Prev][Date Next][Thread Prev][Thread Next][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 )