diff options
author | Samuel Williams <[email protected]> | 2025-06-02 05:50:23 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2025-06-02 18:50:23 +0900 |
commit | 9a292528305e88fc05c054afcfe25fc23e5c9b80 (patch) | |
tree | 43a37073062b5ac41700546f6a687a49693f371e /scheduler.c | |
parent | 20d7db8cbaa617f58d0d262c354c76460a6ad809 (diff) |
Fix compatibility with fiber schedulers that don't implement `#fiber_interrupt`. (#13492)
Notes
Notes:
Merged-By: ioquatix <[email protected]>
Diffstat (limited to 'scheduler.c')
-rw-r--r-- | scheduler.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/scheduler.c b/scheduler.c index 4267cb094f..9f68feef9d 100644 --- a/scheduler.c +++ b/scheduler.c @@ -170,6 +170,10 @@ verify_interface(VALUE scheduler) if (!rb_respond_to(scheduler, id_io_wait)) { rb_raise(rb_eArgError, "Scheduler must implement #io_wait"); } + + if (!rb_respond_to(scheduler, id_fiber_interrupt)) { + rb_warn("Scheduler should implement #fiber_interrupt"); + } } static VALUE @@ -458,7 +462,11 @@ rb_fiber_scheduler_io_wait(VALUE scheduler, VALUE io, VALUE events, VALUE timeou scheduler, io, events, timeout }; - return rb_thread_io_blocking_operation(io, fiber_scheduler_io_wait, (VALUE)&arguments); + if (rb_respond_to(scheduler, id_fiber_interrupt)) { + return rb_thread_io_blocking_operation(io, fiber_scheduler_io_wait, (VALUE)&arguments); + } else { + return fiber_scheduler_io_wait((VALUE)&arguments); + } } VALUE @@ -546,7 +554,11 @@ rb_fiber_scheduler_io_read(VALUE scheduler, VALUE io, VALUE buffer, size_t lengt scheduler, io, buffer, SIZET2NUM(length), SIZET2NUM(offset) }; - return rb_thread_io_blocking_operation(io, fiber_scheduler_io_read, (VALUE)&arguments); + if (rb_respond_to(scheduler, id_fiber_interrupt)) { + return rb_thread_io_blocking_operation(io, fiber_scheduler_io_read, (VALUE)&arguments); + } else { + return fiber_scheduler_io_read((VALUE)&arguments); + } } /* @@ -581,7 +593,11 @@ rb_fiber_scheduler_io_pread(VALUE scheduler, VALUE io, rb_off_t from, VALUE buff scheduler, io, buffer, OFFT2NUM(from), SIZET2NUM(length), SIZET2NUM(offset) }; - return rb_thread_io_blocking_operation(io, fiber_scheduler_io_pread, (VALUE)&arguments); + if (rb_respond_to(scheduler, id_fiber_interrupt)) { + return rb_thread_io_blocking_operation(io, fiber_scheduler_io_pread, (VALUE)&arguments); + } else { + return fiber_scheduler_io_pread((VALUE)&arguments); + } } /* @@ -630,7 +646,11 @@ rb_fiber_scheduler_io_write(VALUE scheduler, VALUE io, VALUE buffer, size_t leng scheduler, io, buffer, SIZET2NUM(length), SIZET2NUM(offset) }; - return rb_thread_io_blocking_operation(io, fiber_scheduler_io_write, (VALUE)&arguments); + if (rb_respond_to(scheduler, id_fiber_interrupt)) { + return rb_thread_io_blocking_operation(io, fiber_scheduler_io_write, (VALUE)&arguments); + } else { + return fiber_scheduler_io_write((VALUE)&arguments); + } } /* @@ -666,7 +686,11 @@ rb_fiber_scheduler_io_pwrite(VALUE scheduler, VALUE io, rb_off_t from, VALUE buf scheduler, io, buffer, OFFT2NUM(from), SIZET2NUM(length), SIZET2NUM(offset) }; - return rb_thread_io_blocking_operation(io, fiber_scheduler_io_pwrite, (VALUE)&arguments); + if (rb_respond_to(scheduler, id_fiber_interrupt)) { + return rb_thread_io_blocking_operation(io, fiber_scheduler_io_pwrite, (VALUE)&arguments); + } else { + return fiber_scheduler_io_pwrite((VALUE)&arguments); + } } VALUE |