ruby-changes:2937
From: ko1@a...
Date: 21 Dec 2007 18:44:12 +0900
Subject: [ruby-changes:2937] ko1 - Ruby:r14428 (trunk): * io.c: write() should be in blocking region.
ko1 2007-12-21 18:43:49 +0900 (Fri, 21 Dec 2007) New Revision: 14428 Modified files: trunk/ChangeLog trunk/bootstraptest/test_io.rb trunk/bootstraptest/test_knownbug.rb trunk/io.c Log: * io.c: write() should be in blocking region. * bootstraptest/test_io.rb, test_knownbug.rb: move a fixed test. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bootstraptest/test_io.rb?r1=14428&r2=14427 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14428&r2=14427 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=14428&r2=14427 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bootstraptest/test_knownbug.rb?r1=14428&r2=14427 Index: ChangeLog =================================================================== --- ChangeLog (revision 14427) +++ ChangeLog (revision 14428) @@ -1,3 +1,9 @@ +Fri Dec 21 18:40:54 2007 Koichi Sasada <ko1@a...> + + * io.c: write() should be in blocking region. + + * bootstraptest/test_io.rb, test_knownbug.rb: move a fixed test. + Fri Dec 21 17:56:30 2007 <nagai@o...> * ext/tk/tcltklib.c: provisional support on Ruby-VM. Index: bootstraptest/test_knownbug.rb =================================================================== --- bootstraptest/test_knownbug.rb (revision 14427) +++ bootstraptest/test_knownbug.rb (revision 14428) @@ -3,18 +3,3 @@ # So all tests will cause failure. # -assert_finish 2, %q{ - require "io/nonblock" - r, w = IO.pipe - w.nonblock = true - w.write_nonblock("a" * 100000) - w.nonblock = false - t1 = Thread.new { w.write("b" * 4096) } - t2 = Thread.new { w.write("c" * 4096) } - sleep 0.5 - r.sysread(4096).length - sleep 0.5 - r.sysread(4096).length - t1.join - t2.join -}, '[ruby-dev:32566]' Index: bootstraptest/test_io.rb =================================================================== --- bootstraptest/test_io.rb (revision 14427) +++ bootstraptest/test_io.rb (revision 14428) @@ -7,3 +7,19 @@ sleep 0.1 w.write "a" }, '[ruby-dev:31866]' + +assert_finish 10, %q{ + require "io/nonblock" + r, w = IO.pipe + w.nonblock = true + w.write_nonblock("a" * 100000) + w.nonblock = false + t1 = Thread.new { w.write("b" * 4096) } + t2 = Thread.new { w.write("c" * 4096) } + sleep 0.5 + r.sysread(4096).length + sleep 0.5 + r.sysread(4096).length + t1.join + t2.join +}, '[ruby-dev:32566]' Index: io.c =================================================================== --- io.c (revision 14427) +++ io.c (revision 14428) @@ -455,7 +455,50 @@ return fptr->mode & FMODE_WSPLIT; } +struct io_internal_struct { + int fd; + void *buf; + size_t capa; + int is_read; +}; + +static VALUE +internal_io_func(void *ptr) +{ + struct io_internal_struct *iis = (struct io_internal_struct*)ptr; + if (iis->is_read) { + return read(iis->fd, iis->buf, iis->capa); + } + else { + return write(iis->fd, iis->buf, iis->capa); + } +} + static int +rb_read_internal(int fd, void *buf, size_t count) +{ + struct io_internal_struct iis; + iis.fd = fd; + iis.buf = buf; + iis.capa = count; + iis.is_read = 1; + + return rb_thread_blocking_region(internal_io_func, &iis, RB_UBF_DFL, 0); +} + +static int +rb_write_internal(int fd, void *buf, size_t count) +{ + struct io_internal_struct iis; + iis.fd = fd; + iis.buf = buf; + iis.capa = count; + iis.is_read = 0; + + return rb_thread_blocking_region(internal_io_func, &iis, RB_UBF_DFL, 0); +} + +static int io_fflush(rb_io_t *fptr) { int r, l; @@ -479,9 +522,8 @@ wsplit_p(fptr)) { l = PIPE_BUF; } - TRAP_BEG; - r = write(fptr->fd, fptr->wbuf+fptr->wbuf_off, l); - TRAP_END; /* xxx: signal handler may modify wbuf */ + r = rb_write_internal(fptr->fd, fptr->wbuf+fptr->wbuf_off, l); + /* xxx: signal handler may modify wbuf */ if (r == fptr->wbuf_len) { fptr->wbuf_off = 0; fptr->wbuf_len = 0; @@ -627,9 +669,8 @@ wsplit_p(fptr)) { l = PIPE_BUF; } - TRAP_BEG; - r = write(fptr->fd, RSTRING_PTR(str)+offset, l); - TRAP_END; /* xxx: signal handler may modify given string. */ + r = rb_write_internal(fptr->fd, RSTRING_PTR(str)+offset, l); + /* xxx: signal handler may modify given string. */ if (r == n) return len; if (0 <= r) { offset += r; @@ -905,31 +946,7 @@ return INT2FIX(0); } -struct read_struct { - int fd; - void *buf; - size_t capa; -}; - -static VALUE -read_func(void *ptr) -{ - struct read_struct *rs = (struct read_struct*)ptr; - return read(rs->fd, rs->buf, rs->capa); -} - - static int -rb_read_internal(int fd, void *buf, size_t count) -{ - struct read_struct rs; - rs.fd = fd; - rs.buf = buf; - rs.capa = count; - return rb_thread_blocking_region(read_func, &rs, RB_UBF_DFL, 0); -} - -static int io_fillbuf(rb_io_t *fptr) { int r; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml