[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00867] Re: FDclone 3.00h has been released
- Subject: [FDclone-users:00867] Re: FDclone 3.00h has been released
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Mon, 14 Jun 2010 03:51:03 +0900
しらいです。
In Message-Id <20100613180247.408DD480746@yuka.unixusers.net>
Takashi SHIRAI <shirai@unixusers.net>writes:
> しらいです。
> 以下は HISTORY より今回の変更点の抜粋です。
最近更新が無駄に頻発してしまって申し訳ありません。
> 内部変数 PS1 に \[...\] を用いると無限ループに陥る点を修正。
[FDclone-users:00861] で報告のあった bug に対する修正です。
実装コードはまた別の形になっていますが、症状自体は再現しなく
なっていると思います。
> 非標準 C 環境でコンパイルに失敗する点を修正。
[FDclone-users:00863] で報告のあった bug に対する修正です。
こちらは報告時の patch と全く同じコードで修正しています。
> 異常終了時の malloc() 再帰呼出を回避。
これは [FDclone-users:00861] の bug の再現性を確認している
際に見つかった bug に対する修正で、無限ループしている状態を
kill(1) で強制終了させることで発生していました。
この無限ループでは realloc(3) を頻繁に呼出すことになるので、
強制終了させるとかなりの確率で realloc(3) 処理中に割込みが掛
かります。
その割込み処理内で malloc(3) を使ってしまっていたので、そ
の処理を取り除きました。具体的には、log を残そうとして日本語
filename を convert する際の malloc(3) です。
それを取り除いたということは、コード変換されずに filename
に格納されたままの漢字コードで log に残るということになりま
すが、その点は諦めざるを得なかったのでご了承下さい。
あと、変更点には載せていませんが、3.00g で em-bug していた
MS-DOS 版固有の特殊な bug もついでに修正しています。
標準出力や標準エラー出力に buffering 出力している builtin
command が幾つかあって、その中の fputnl() という関数を 3.00g
で削除しました。
fputnl() は改行を出力して buffer を flush する関数で、これ
を \n を出力するコードに置換えることで、コードを見易くして動
作上も効率化を図ろうという意図があった訳です。
標準出力も標準エラー出力も line buffering なので改行時に自
動的に flush される筈だし、setlinebuf(3) の無い MS-DOS 環境
でも自前の stream I/O 関数を使っていて問題ない筈でした。
しかし、「make bsh」で作成される簡易タイプの fdbsh は、自
前の stream I/O 関数を使っていないため、OS 標準の stream I/O
関数を使っており setlinebuf(3) が無効になっていました。
実際は、LSI-C や Turbo C の場合は stdout や stderr は標準
で line buffering されてるので問題ないのですが、DJGPP 環境で
は buffer が flush されないまま次に制御が進んでしまいます。
このため、buffer にデータが溜ったまま redirect 先を変更し
たような場合、本来 redirect 前の出力先に吐かれる筈のデータが
redirect 後の出力先に混入してしまっていました。
builtin 以外の command は exec (MS-DOS の場合は spawn) で
処理されるので stdout も stderr も勝手に flush されますが、
builtin は exec しないので flush されません。
builtin の側で明示的に flush したり line buffering に任せ
たりという従来の実装ではまた同様のコードを実装してしまう危険
があるので、command 完了時に必ず flush させた方が無難です。
他の多くのケースでは無駄なコードになりますが特に悪影響もな
い筈なので、buiiltin だろうが外部 command だろうが、終了時に
は必ず stdout/stderr を flush することにしました。
但し、この症状は fdbsh を DJGPP で build するという特殊な
条件下でのみ発生し、普通の fd や UNIX 版 fdbsh では発生しな
いため、HISTORY では敢えて触れていないという次第です。
しらい たかし