ruby-changes:22797
From: nobu <ko1@a...>
Date: Tue, 28 Feb 2012 18:33:53 +0900 (JST)
Subject: [ruby-changes:22797] nobu:r34846 (trunk): * io.c (io_fread, io_getpartial, rb_io_sysread): set buffer size
nobu 2012-02-28 18:33:35 +0900 (Tue, 28 Feb 2012) New Revision: 34846 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34846 Log: * io.c (io_fread, io_getpartial, rb_io_sysread): set buffer size after check if readable, which can cause thread switch. [ruby-dev:45297][Bug #6099] Modified files: trunk/ChangeLog trunk/io.c trunk/test/ruby/test_io.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 34845) +++ ChangeLog (revision 34846) @@ -1,3 +1,9 @@ +Tue Feb 28 18:33:30 2012 Nobuyoshi Nakada <nobu@r...> + + * io.c (io_fread, io_getpartial, rb_io_sysread): set buffer size + after check if readable, which can cause thread switch. + [ruby-dev:45297][Bug #6099] + Tue Feb 28 17:16:01 2012 Nobuyoshi Nakada <nobu@r...> * lib/time.rb (Time#xmlschema): use strftime specifiers instead of Index: io.c =================================================================== --- io.c (revision 34845) +++ io.c (revision 34846) @@ -1872,11 +1872,14 @@ return len - n; } +static void io_setstrbuf(VALUE *str, long len); + static long io_fread(VALUE str, long offset, long size, rb_io_t *fptr) { long len; + io_setstrbuf(&str, offset + size); rb_str_locktmp(str); len = io_bufread(RSTRING_PTR(str) + offset, size, fptr); rb_str_unlocktmp(str); @@ -2208,6 +2211,7 @@ if (nonblock) { rb_io_set_nonblock(fptr); } + io_setstrbuf(&str, len); rb_str_locktmp(str); n = rb_read_internal(fptr->fd, RSTRING_PTR(str), len); rb_str_unlocktmp(str); @@ -4269,6 +4273,7 @@ rb_thread_wait_fd(fptr->fd); rb_io_check_closed(fptr); + io_setstrbuf(&str, ilen); rb_str_locktmp(str); n = rb_read_internal(fptr->fd, RSTRING_PTR(str), ilen); rb_str_unlocktmp(str); Index: test/ruby/test_io.rb =================================================================== --- test/ruby/test_io.rb (revision 34845) +++ test/ruby/test_io.rb (revision 34846) @@ -2240,4 +2240,37 @@ assert_equal(1, $stdout.fileno) assert_equal(2, $stderr.fileno) end + + def test_sysread_locktmp + bug6099 = '[ruby-dev:45297]' + buf = " " * 100 + data = "a" * 100 + with_pipe do |r,w| + th = Thread.new {r.sysread(100, buf)} + Thread.pass until th.stop? + buf.replace("") + assert_empty(buf) + w.write(data) + Thread.pass while th.alive? + th.join + end + assert_equal(data, buf) + end + + def test_readpartial_locktmp + bug6099 = '[ruby-dev:45297]' + buf = " " * 100 + data = "a" * 100 + with_pipe do |r,w| + r.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK) + th = Thread.new {r.readpartial(100, buf)} + Thread.pass until th.stop? + buf.replace("") + assert_empty(buf) + w.write(data) + Thread.pass while th.alive? + th.join + end + assert_equal(data, buf) + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/