summaryrefslogtreecommitdiff
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
parent701dcbb3ca9bf04b61cc07156608c61aaf9173f0 (diff)
Prefer `rb_thread_current_scheduler`.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3434
-rw-r--r--io.c26
-rw-r--r--process.c2
2 files changed, 23 insertions, 5 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;
diff --git a/process.c b/process.c
index 317f7ff3ec..8abb3ea86f 100644
--- a/process.c
+++ b/process.c
@@ -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);