summaryrefslogtreecommitdiff
path: root/scheduler.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-07-02 22:41:16 +1200
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-11-10 19:21:05 +1300
commit4b8903421828cb9d4de139180563ae8d8f04e1ab (patch)
tree21a0d02ba22afad6a4ce1c042acf6d74767dc5a2 /scheduler.c
parent56b90cf94465ce347a3d9a779363c78ce3deb180 (diff)
IO::Buffer for scheduler interface.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4621
Diffstat (limited to 'scheduler.c')
-rw-r--r--scheduler.c49
1 files changed, 42 insertions, 7 deletions
diff --git a/scheduler.c b/scheduler.c
index 127d63383b..91abeb82e3 100644
--- a/scheduler.c
+++ b/scheduler.c
@@ -11,6 +11,8 @@
#include "vm_core.h"
#include "ruby/fiber/scheduler.h"
#include "ruby/io.h"
+#include "ruby/io/buffer.h"
+
#include "internal/thread.h"
static ID id_close;
@@ -26,6 +28,7 @@ static ID id_process_wait;
static ID id_io_read;
static ID id_io_write;
static ID id_io_wait;
+static ID id_io_close;
static ID id_address_resolve;
@@ -45,6 +48,7 @@ Init_Fiber_Scheduler(void)
id_io_read = rb_intern_const("io_read");
id_io_write = rb_intern_const("io_write");
id_io_wait = rb_intern_const("io_wait");
+ id_io_close = rb_intern_const("io_close");
id_address_resolve = rb_intern_const("address_resolve");
}
@@ -225,24 +229,55 @@ rb_fiber_scheduler_io_wait_writable(VALUE scheduler, VALUE io)
}
VALUE
-rb_fiber_scheduler_io_read(VALUE scheduler, VALUE io, VALUE buffer, size_t offset, size_t length)
+rb_fiber_scheduler_io_read(VALUE scheduler, VALUE io, VALUE buffer, size_t length)
{
VALUE arguments[] = {
- io, buffer, SIZET2NUM(offset), SIZET2NUM(length)
+ io, buffer, SIZET2NUM(length)
};
- return rb_check_funcall(scheduler, id_io_read, 4, arguments);
+ return rb_check_funcall(scheduler, id_io_read, 3, arguments);
}
VALUE
-rb_fiber_scheduler_io_write(VALUE scheduler, VALUE io, VALUE buffer, size_t offset, size_t length)
+rb_fiber_scheduler_io_write(VALUE scheduler, VALUE io, VALUE buffer, size_t length)
{
VALUE arguments[] = {
- io, buffer, SIZET2NUM(offset), SIZET2NUM(length)
+ io, buffer, SIZET2NUM(length)
};
- // We should ensure string has capacity to receive data, and then resize it afterwards.
- return rb_check_funcall(scheduler, id_io_write, 4, arguments);
+ return rb_check_funcall(scheduler, id_io_write, 3, 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);
+
+ VALUE result = rb_fiber_scheduler_io_read(scheduler, io, buffer, length);
+
+ rb_io_buffer_free(buffer);
+
+ return result;
+}
+
+VALUE
+rb_fiber_scheduler_io_write_memory(VALUE scheduler, VALUE io, const void *base, size_t size, size_t length)
+{
+ VALUE buffer = rb_io_buffer_new((void*)base, size, RB_IO_BUFFER_LOCKED|RB_IO_BUFFER_IMMUTABLE);
+
+ VALUE result = rb_fiber_scheduler_io_write(scheduler, io, buffer, length);
+
+ rb_io_buffer_free(buffer);
+
+ return result;
+}
+
+VALUE
+rb_fiber_scheduler_io_close(VALUE scheduler, VALUE io)
+{
+ VALUE arguments[] = {io};
+
+ return rb_check_funcall(scheduler, id_io_close, 1, arguments);
}
VALUE