@@ -170,6 +170,10 @@ verify_interface(VALUE scheduler)
170170 if (!rb_respond_to (scheduler , id_io_wait )) {
171171 rb_raise (rb_eArgError , "Scheduler must implement #io_wait" );
172172 }
173+
174+ if (!rb_respond_to (scheduler , id_fiber_interrupt )) {
175+ rb_warn ("Scheduler should implement #fiber_interrupt" );
176+ }
173177}
174178
175179static VALUE
@@ -458,7 +462,11 @@ rb_fiber_scheduler_io_wait(VALUE scheduler, VALUE io, VALUE events, VALUE timeou
458462 scheduler , io , events , timeout
459463 };
460464
461- return rb_thread_io_blocking_operation (io , fiber_scheduler_io_wait , (VALUE )& arguments );
465+ if (rb_respond_to (scheduler , id_fiber_interrupt )) {
466+ return rb_thread_io_blocking_operation (io , fiber_scheduler_io_wait , (VALUE )& arguments );
467+ } else {
468+ return fiber_scheduler_io_wait ((VALUE )& arguments );
469+ }
462470}
463471
464472VALUE
@@ -546,7 +554,11 @@ rb_fiber_scheduler_io_read(VALUE scheduler, VALUE io, VALUE buffer, size_t lengt
546554 scheduler , io , buffer , SIZET2NUM (length ), SIZET2NUM (offset )
547555 };
548556
549- return rb_thread_io_blocking_operation (io , fiber_scheduler_io_read , (VALUE )& arguments );
557+ if (rb_respond_to (scheduler , id_fiber_interrupt )) {
558+ return rb_thread_io_blocking_operation (io , fiber_scheduler_io_read , (VALUE )& arguments );
559+ } else {
560+ return fiber_scheduler_io_read ((VALUE )& arguments );
561+ }
550562}
551563
552564/*
@@ -581,7 +593,11 @@ rb_fiber_scheduler_io_pread(VALUE scheduler, VALUE io, rb_off_t from, VALUE buff
581593 scheduler , io , buffer , OFFT2NUM (from ), SIZET2NUM (length ), SIZET2NUM (offset )
582594 };
583595
584- return rb_thread_io_blocking_operation (io , fiber_scheduler_io_pread , (VALUE )& arguments );
596+ if (rb_respond_to (scheduler , id_fiber_interrupt )) {
597+ return rb_thread_io_blocking_operation (io , fiber_scheduler_io_pread , (VALUE )& arguments );
598+ } else {
599+ return fiber_scheduler_io_pread ((VALUE )& arguments );
600+ }
585601}
586602
587603/*
@@ -630,7 +646,11 @@ rb_fiber_scheduler_io_write(VALUE scheduler, VALUE io, VALUE buffer, size_t leng
630646 scheduler , io , buffer , SIZET2NUM (length ), SIZET2NUM (offset )
631647 };
632648
633- return rb_thread_io_blocking_operation (io , fiber_scheduler_io_write , (VALUE )& arguments );
649+ if (rb_respond_to (scheduler , id_fiber_interrupt )) {
650+ return rb_thread_io_blocking_operation (io , fiber_scheduler_io_write , (VALUE )& arguments );
651+ } else {
652+ return fiber_scheduler_io_write ((VALUE )& arguments );
653+ }
634654}
635655
636656/*
@@ -666,7 +686,11 @@ rb_fiber_scheduler_io_pwrite(VALUE scheduler, VALUE io, rb_off_t from, VALUE buf
666686 scheduler , io , buffer , OFFT2NUM (from ), SIZET2NUM (length ), SIZET2NUM (offset )
667687 };
668688
669- return rb_thread_io_blocking_operation (io , fiber_scheduler_io_pwrite , (VALUE )& arguments );
689+ if (rb_respond_to (scheduler , id_fiber_interrupt )) {
690+ return rb_thread_io_blocking_operation (io , fiber_scheduler_io_pwrite , (VALUE )& arguments );
691+ } else {
692+ return fiber_scheduler_io_pwrite ((VALUE )& arguments );
693+ }
670694}
671695
672696VALUE
0 commit comments