aboutsummaryrefslogtreecommitdiffstats
path: root/io.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2020-09-05 14:30:21 +1200
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2020-09-14 16:44:09 +1200
commit9e0a48c7a31ecd39be0596d0517b9d521ae75282 (patch)
tree19abd9cb95734086fb2684de3ea72e7fdce25cad /io.c
parent701dcbb3ca9bf04b61cc07156608c61aaf9173f0 (diff)
downloadruby-9e0a48c7a31ecd39be0596d0517b9d521ae75282.tar.gz
Prefer `rb_thread_current_scheduler`.
Diffstat (limited to 'io.c')
-rw-r--r--io.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/io.c b/io.c
index f73a508a0c..ed808d071c 100644
--- a/io.c
+++ b/io.c
@@ -1314,7 +1314,7 @@ rb_io_from_fd(int f)
int
rb_io_wait_readable(int f)
{
- VALUE scheduler = rb_thread_scheduler_if_nonblocking(rb_thread_current());
+ VALUE scheduler = rb_thread_current_scheduler();
if (scheduler != Qnil) {
return RTEST(
rb_scheduler_io_wait_readable(scheduler, rb_io_from_fd(f))
@@ -1345,7 +1345,7 @@ rb_io_wait_readable(int f)
int
rb_io_wait_writable(int f)
{
- VALUE scheduler = rb_thread_scheduler_if_nonblocking(rb_thread_current());
+ VALUE scheduler = rb_thread_current_scheduler();
if (scheduler != Qnil) {
return RTEST(
rb_scheduler_io_wait_writable(scheduler, rb_io_from_fd(f))
@@ -1545,6 +1545,18 @@ io_binwrite(VALUE str, const char *ptr, long len, rb_io_t *fptr, int nosync)
rb_thread_check_ints();
if ((n = len) <= 0) return n;
+
+ VALUE scheduler = rb_thread_current_scheduler();
+ if (scheduler != Qnil && rb_scheduler_supports_io_write(scheduler)) {
+ ssize_t length = RB_NUM2SSIZE(
+ rb_scheduler_io_write(scheduler, fptr->self, str, offset, len)
+ );
+
+ if (length < 0) rb_sys_fail_path(fptr->pathv);
+
+ return length;
+ }
+
if (fptr->wbuf.ptr == NULL && !(!nosync && (fptr->mode & FMODE_SYNC))) {
fptr->wbuf.off = 0;
fptr->wbuf.len = 0;
@@ -2621,9 +2633,15 @@ io_fread(VALUE str, long offset, long size, rb_io_t *fptr)
{
VALUE scheduler = rb_thread_current_scheduler();
if (scheduler != Qnil && rb_scheduler_supports_io_read(scheduler)) {
- return rb_scheduler_io_read(scheduler, fptr->self, str, offset, size);
+ ssize_t length = RB_NUM2SSIZE(
+ rb_scheduler_io_read(scheduler, fptr->self, str, offset, size)
+ );
+
+ if (length < 0) rb_sys_fail_path(fptr->pathv);
+
+ return length;
}
-
+
long len;
struct bufread_arg arg;