From: Tanaka Akira Date: 2004-12-07T02:12:29+09:00 Subject: [ruby-dev:25084] Re: IO#flush dumps core again In article <1102352264.403197.20871.nullmailer@x31.priv.netlab.jp>, Yukihiro Matsumoto writes: > 完全に全部理解できたとは言いがたいのですが、その方針でコード > を書いていただけませんか? Index: io.c =================================================================== RCS file: /src/ruby/io.c,v retrieving revision 1.347 diff -u -p -r1.347 io.c --- io.c 6 Dec 2004 15:31:26 -0000 1.347 +++ io.c 6 Dec 2004 17:07:26 -0000 @@ -475,7 +475,7 @@ io_fwrite(str, fptr) (fptr->wbuf && fptr->wbuf_capa <= fptr->wbuf_len + len) || ((fptr->mode & FMODE_LINEBUF) && memchr(RSTRING(str)->ptr+offset, '\n', len))) { /* xxx: use writev to avoid double write if available */ - if (fptr->wbuf_len+len <= fptr->wbuf_capa) { + if (fptr->wbuf_len && fptr->wbuf_len+len <= fptr->wbuf_capa) { if (fptr->wbuf_capa < fptr->wbuf_off+fptr->wbuf_len+len) { MEMMOVE(fptr->wbuf, fptr->wbuf+fptr->wbuf_off, char, fptr->wbuf_len); fptr->wbuf_off = 0; @@ -488,7 +488,7 @@ io_fwrite(str, fptr) return -1L; if (n == 0) return len; - if (!rb_thread_fd_writable(fptr->fd)) { + if (fptr->f != stderr && !rb_thread_fd_writable(fptr->fd)) { rb_io_check_closed(fptr); } retry: という感じでしょうか。 最初の hunk は基本的にはメモリコピーの減少が狙いですが、 stderr に対し て io_fflush が効かないようにするための仕掛けでもあります。 後の hunk が本題で、stderr に対しては rb_thread_fd_writable を呼び出さ ないようにしています。 -- [田中 哲][たなか あきら][Tanaka Akira]