From: Yusuke ENDOH Date: 2010-02-11T17:34:04+09:00 Subject: [ruby-dev:40391] Re: [Bug:trunk] TCPServer#gets gets stuck 遠藤です。 連投すみません。 2010年2月11日17:14 Yusuke ENDOH : > - read にバッファを明示して待ち状態にし、 > - read 分に満たないだけ write して (これでチェックをかわせる) > - バッファを modify した後で > - write しても例外が上がらず変なことになる (ことがある) > > というわけで、このチェックには今のところ意味がないと思います。 このチェック回避のアプローチで、めでたく今回の変更前でも落とせる ことが確認できました。 $ cat t.rb r, w = IO.pipe s = "" n = 10000 w.write("foo") t = Thread.new { r.read(n, s) } (sleep 1; p [s[0, 5], s.size]) until s.size == n s.clear w.write("barbaz" * 1000) w.close t.join $ ruby-1.9.1-p378 t.rb ["foo\x00\x00", 10000] t.rb:9: [BUG] Segmentation fault ruby 1.9.1p378 (2010-01-10 revision 26273) [i686-linux] -- control frame ---------- c:0003 p:0182 s:0012 b:0011 l:001784 d:002150 EVAL t.rb:9 c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH c:0001 p:0000 s:0002 b:0002 l:001784 d:001784 TOP --------------------------- セグメンテーション違反です 再現性はあまり高くないようです (20 回に 1 回くらい?) 。 > やるとしたら、io_read の中の READ_CHECK の直後だけでチェックしても > だめで、buffer string に書こうとする直前で毎回チェックする必要が > あると思いますが、IO のパフォーマンスが下がりそうなのでそこまでする > 必要があるかどうかはわかりません。 のように、今回の変更とは関係なく、io_fread などの実行中に文字列がいじられて いないかチェックする必要がありそうです。 -- Yusuke ENDOH