From bed920f0731a1a89a0e5fc7a7428d21be3ffb8a0 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Thu, 23 Dec 2021 12:20:09 +1300 Subject: Add fiber scheduler hooks for `pread`/`pwrite`, and add support to `IO::Buffer`. --- include/ruby/fiber/scheduler.h | 26 ++++++++++++++++++++++++++ include/ruby/io/buffer.h | 6 ++++++ 2 files changed, 32 insertions(+) (limited to 'include') diff --git a/include/ruby/fiber/scheduler.h b/include/ruby/fiber/scheduler.h index ff587e28c0..a255a1a712 100644 --- a/include/ruby/fiber/scheduler.h +++ b/include/ruby/fiber/scheduler.h @@ -261,6 +261,32 @@ VALUE rb_fiber_scheduler_io_read(VALUE scheduler, VALUE io, VALUE buffer, size_t */ VALUE rb_fiber_scheduler_io_write(VALUE scheduler, VALUE io, VALUE buffer, size_t length); +/** + * Nonblocking read from the passed IO at the specified offset. + * + * @param[in] scheduler Target scheduler. + * @param[out] io An io object to read from. + * @param[out] buffer Return buffer. + * @param[in] length Requested number of bytes to read. + * @param[in] offset The offset in the given IO to read the data from. + * @retval RUBY_Qundef `scheduler` doesn't have `#io_read`. + * @return otherwise What `scheduler.io_read` returns. + */ +VALUE rb_fiber_scheduler_io_pread(VALUE scheduler, VALUE io, VALUE buffer, size_t length, off_t offset); + +/** + * Nonblocking write to the passed IO at the specified offset. + * + * @param[in] scheduler Target scheduler. + * @param[out] io An io object to write to. + * @param[in] buffer What to write. + * @param[in] length Number of bytes to write. + * @param[in] offset The offset in the given IO to write the data to. + * @retval RUBY_Qundef `scheduler` doesn't have `#io_write`. + * @return otherwise What `scheduler.io_write` returns. + */ +VALUE rb_fiber_scheduler_io_pwrite(VALUE scheduler, VALUE io, VALUE buffer, size_t length, off_t offset); + /** * Nonblocking read from the passed IO using a native buffer. * diff --git a/include/ruby/io/buffer.h b/include/ruby/io/buffer.h index 4826a7a76f..907fec20bb 100644 --- a/include/ruby/io/buffer.h +++ b/include/ruby/io/buffer.h @@ -80,6 +80,12 @@ VALUE rb_io_buffer_transfer(VALUE self); void rb_io_buffer_resize(VALUE self, size_t size); void rb_io_buffer_clear(VALUE self, uint8_t value, size_t offset, size_t length); +// The length is the minimum required length. +VALUE rb_io_buffer_read(VALUE self, VALUE io, size_t length); +VALUE rb_io_buffer_pread(VALUE self, VALUE io, size_t length, off_t offset); +VALUE rb_io_buffer_write(VALUE self, VALUE io, size_t length); +VALUE rb_io_buffer_pwrite(VALUE self, VALUE io, size_t length, off_t offset); + RBIMPL_SYMBOL_EXPORT_END() #endif /* RUBY_IO_BUFFER_T */ -- cgit v1.2.3