summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--io.c12
2 files changed, 16 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 1d6ba3af7e..2dcc01158a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sun Sep 9 16:08:48 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * io.c (io_bufread): removed unnecessary rb_thread_wait_fd().
+ Patch by Eric Wong. [Bug #6629] [ruby-core:45789]
+ * io.c (rb_io_sysread): ditto.
+ * io.c (copy_stream_fallback_body): ditto.
+
Sun Sep 9 15:21:52 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* thread.c (rb_mutex_lock): stop multiple threads use
diff --git a/io.c b/io.c
index b8f6efbe8d..39c922135e 100644
--- a/io.c
+++ b/io.c
@@ -1912,7 +1912,6 @@ io_bufread(char *ptr, long len, rb_io_t *fptr)
}
offset += c;
if ((n -= c) <= 0) break;
- rb_thread_wait_fd(fptr->fd);
}
return len - n;
}
@@ -1923,7 +1922,6 @@ io_bufread(char *ptr, long len, rb_io_t *fptr)
offset += c;
if ((n -= c) <= 0) break;
}
- rb_thread_wait_fd(fptr->fd);
rb_io_check_closed(fptr);
if (io_fillbuf(fptr) < 0) {
break;
@@ -4338,7 +4336,16 @@ rb_io_sysread(int argc, VALUE *argv, VALUE io)
}
n = fptr->fd;
+
+ /*
+ * FIXME: removing rb_thread_wait_fd() here changes sysread semantics
+ * on non-blocking IOs. However, it's still currently possible
+ * for sysread to raise Errno::EAGAIN if another thread read()s
+ * the IO after we return from rb_thread_wait_fd() but before
+ * we call read()
+ */
rb_thread_wait_fd(fptr->fd);
+
rb_io_check_closed(fptr);
io_setstrbuf(&str, ilen);
@@ -9796,7 +9803,6 @@ copy_stream_fallback_body(VALUE arg)
}
else {
ssize_t ss;
- rb_thread_wait_fd(stp->src_fd);
rb_str_resize(buf, buflen);
ss = maygvl_copy_stream_read(1, stp, RSTRING_PTR(buf), l, off);
if (ss == -1)