From: "H.Yamamoto" Date: 2004-05-26T18:31:58+09:00 Subject: [ruby-dev:23627] Re: console freezed on test/drb/drbtest.rb : test_06_timeout (bcc32) 山本です。 bcc32だと閉じたファイル・ソケットに対して fwrite した後、ferror が 0 を返してしまいます。 そのため、rb_io_fwrite(io.c) が無限ループになります。 とりあえずいい方法が思い浮かばなかったので read(0).nil? を使いましたが、 読み込めるのと書き込めるのは別問題なので、いい方法ではありませんでした。 むしろ、drb ではなく、io.c で対処すべきだと思ったので、パッチをつくってみました。 あまり自信がありませんが、とりあえずフリーズはしなくなりました。 * 連続5回、全く書き込めなかったら、ファイルディスクリプタが無効と判断 Index: io.c =================================================================== RCS file: /ruby/ruby/io.c,v retrieving revision 1.275 diff -u -w -b -p -r1.275 io.c --- io.c 26 May 2004 04:15:01 -0000 1.275 +++ io.c 26 May 2004 09:21:04 -0000 @@ -397,7 +397,7 @@ rb_io_fwrite(ptr, len, f) long len; FILE *f; { - long n, r; + long n, r, count = 0; if ((n = len) <= 0) return n; #ifdef __human68k__ @@ -417,6 +417,12 @@ rb_io_fwrite(ptr, len, f) clearerr(f); continue; } + return -1L; + } + if (r > 0) + count = 0; + else if (++count == 5) { + errno = EINVAL; return -1L; } }