diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-09-05 14:30:21 +1200 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-09-14 16:44:09 +1200 |
commit | 9e0a48c7a31ecd39be0596d0517b9d521ae75282 (patch) | |
tree | 19abd9cb95734086fb2684de3ea72e7fdce25cad | |
parent | 701dcbb3ca9bf04b61cc07156608c61aaf9173f0 (diff) |
Prefer `rb_thread_current_scheduler`.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3434
-rw-r--r-- | io.c | 26 | ||||
-rw-r--r-- | process.c | 2 |
2 files changed, 23 insertions, 5 deletions
@@ -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; @@ -4926,7 +4926,7 @@ static VALUE rb_f_sleep(int argc, VALUE *argv, VALUE _) { time_t beg = time(0); - VALUE scheduler = rb_thread_scheduler_if_nonblocking(rb_thread_current()); + VALUE scheduler = rb_thread_current_scheduler(); if (scheduler != Qnil) { rb_scheduler_kernel_sleepv(scheduler, argc, argv); |