From: wanabe Date: 2008-05-05T16:44:45+09:00 Subject: [ruby-dev:34595] スレッド中の IO#flush で表示が乱れる ワナベと申します。 スレッド中で文字数が PIPE_BUF の2倍以上の文字列を IO#flush した場合、文字列が途切れることがあります。 また同様に文字数が PIPE_BUF 以上の文字列では 出力に余分な文字列がつくことがあります。 きちんと適宜 flush をしてくれる端末では再現しません。 具体的には、以下のようなスクリプトで起こりえます。 Thread.new do print " "*2047 + "foo" STDOUT.flush print "."*1025 STDOUT.flush end sleep 0.1 PIPE_BUF == 1024 の手元の環境(Mingw + MSYS + rxvt)では 空白列、foo、ドット列といった出力を得るはずが 空白列、f、ドット列、空白列、fという出力になってしまいます。 再現する端末が少ないと思い、長めに説明させていただきました。 くどくなってしまい申し訳ありません。パッチは短いです。 Index: io.c =================================================================== --- io.c (revision 16278) +++ io.c (working copy) @@ -584,8 +584,8 @@ return 0; } if (0 <= r) { - fptr->wbuf_off = r; - fptr->wbuf_len = r; + fptr->wbuf_off += r; + fptr->wbuf_len -= r; errno = EAGAIN; } if (rb_io_wait_writable(fptr->fd)) { -- ワナベ