diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2021-12-23 12:20:09 +1300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-23 12:20:09 +1300 |
commit | bed920f0731a1a89a0e5fc7a7428d21be3ffb8a0 (patch) | |
tree | 928abd45556a6f2380211ef347ce0df9c0858db9 /scheduler.c | |
parent | 91c5c1c132994c9ca4540125d462988d83e37a6b (diff) |
Add fiber scheduler hooks for `pread`/`pwrite`, and add support to `IO::Buffer`.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/5249
Merged-By: ioquatix <samuel@codeotaku.com>
Diffstat (limited to 'scheduler.c')
-rw-r--r-- | scheduler.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/scheduler.c b/scheduler.c index 51696ab18f..06658356b1 100644 --- a/scheduler.c +++ b/scheduler.c @@ -25,8 +25,8 @@ static ID id_timeout_after; static ID id_kernel_sleep; static ID id_process_wait; -static ID id_io_read; -static ID id_io_write; +static ID id_io_read, id_io_pread; +static ID id_io_write, id_io_pwrite; static ID id_io_wait; static ID id_io_close; @@ -46,7 +46,10 @@ Init_Fiber_Scheduler(void) id_process_wait = rb_intern_const("process_wait"); id_io_read = rb_intern_const("io_read"); + id_io_pread = rb_intern_const("io_pread"); id_io_write = rb_intern_const("io_write"); + id_io_pwrite = rb_intern_const("io_pwrite"); + id_io_wait = rb_intern_const("io_wait"); id_io_close = rb_intern_const("io_close"); @@ -239,6 +242,16 @@ rb_fiber_scheduler_io_read(VALUE scheduler, VALUE io, VALUE buffer, size_t lengt } VALUE +rb_fiber_scheduler_io_pread(VALUE scheduler, VALUE io, VALUE buffer, size_t length, off_t offset) +{ + VALUE arguments[] = { + io, buffer, SIZET2NUM(length), OFFT2NUM(offset) + }; + + return rb_check_funcall(scheduler, id_io_pread, 4, arguments); +} + +VALUE rb_fiber_scheduler_io_write(VALUE scheduler, VALUE io, VALUE buffer, size_t length) { VALUE arguments[] = { @@ -249,6 +262,16 @@ rb_fiber_scheduler_io_write(VALUE scheduler, VALUE io, VALUE buffer, size_t leng } VALUE +rb_fiber_scheduler_io_pwrite(VALUE scheduler, VALUE io, VALUE buffer, size_t length, off_t offset) +{ + VALUE arguments[] = { + io, buffer, SIZET2NUM(length), OFFT2NUM(offset) + }; + + return rb_check_funcall(scheduler, id_io_pwrite, 4, arguments); +} + +VALUE rb_fiber_scheduler_io_read_memory(VALUE scheduler, VALUE io, void *base, size_t size, size_t length) { VALUE buffer = rb_io_buffer_new(base, size, RB_IO_BUFFER_LOCKED); |