@@ -303,7 +303,7 @@ VALUE IO_Event_Selector_URing_push(VALUE self, VALUE fiber)
303303
304304 IO_Event_Selector_ready_push (& selector -> backend , fiber );
305305
306- return Qnil ;
306+ return fiber ;
307307}
308308
309309VALUE IO_Event_Selector_URing_raise (int argc , VALUE * argv , VALUE self )
@@ -522,6 +522,7 @@ int events_from_poll_flags(short flags) {
522522struct io_wait_arguments {
523523 struct IO_Event_Selector_URing * selector ;
524524 struct IO_Event_Selector_URing_Waiting * waiting ;
525+ VALUE io ;
525526 short flags ;
526527};
527528
@@ -548,7 +549,7 @@ VALUE io_wait_transfer(VALUE _arguments) {
548549 struct io_wait_arguments * arguments = (struct io_wait_arguments * )_arguments ;
549550 struct IO_Event_Selector_URing * selector = arguments -> selector ;
550551
551- IO_Event_Selector_loop_yield (& selector -> backend );
552+ IO_Event_Selector_loop_yield_io (& selector -> backend , arguments -> io );
552553
553554 if (DEBUG ) fprintf (stderr , "io_wait_transfer:waiting=%p, result=%d\n" , (void * )arguments -> waiting , arguments -> waiting -> result );
554555
@@ -588,7 +589,8 @@ VALUE IO_Event_Selector_URing_io_wait(VALUE self, VALUE fiber, VALUE io, VALUE e
588589 struct io_wait_arguments io_wait_arguments = {
589590 .selector = selector ,
590591 .waiting = & waiting ,
591- .flags = flags
592+ .io = io ,
593+ .flags = flags ,
592594 };
593595
594596 return rb_ensure (io_wait_transfer , (VALUE )& io_wait_arguments , io_wait_ensure , (VALUE )& io_wait_arguments );
@@ -619,6 +621,7 @@ static inline off_t io_seekable(int descriptor)
619621struct io_read_arguments {
620622 struct IO_Event_Selector_URing * selector ;
621623 struct IO_Event_Selector_URing_Waiting * waiting ;
624+ VALUE io ;
622625 int descriptor ;
623626 off_t offset ;
624627 char * buffer ;
@@ -638,7 +641,7 @@ io_read_submit(VALUE _arguments)
638641 io_uring_sqe_set_data (sqe , arguments -> waiting -> completion );
639642 io_uring_submit_now (selector );
640643
641- IO_Event_Selector_loop_yield (& selector -> backend );
644+ IO_Event_Selector_loop_yield_io (& selector -> backend , arguments -> io );
642645
643646 return RB_INT2NUM (arguments -> waiting -> result );
644647}
@@ -664,7 +667,7 @@ io_read_ensure(VALUE _arguments)
664667}
665668
666669static int
667- io_read (struct IO_Event_Selector_URing * selector , VALUE fiber , int descriptor , char * buffer , size_t length , off_t offset )
670+ io_read (struct IO_Event_Selector_URing * selector , VALUE fiber , VALUE io , int descriptor , char * buffer , size_t length , off_t offset )
668671{
669672 struct IO_Event_Selector_URing_Waiting waiting = {
670673 .fiber = fiber ,
@@ -677,6 +680,7 @@ io_read(struct IO_Event_Selector_URing *selector, VALUE fiber, int descriptor, c
677680 struct io_read_arguments io_read_arguments = {
678681 .selector = selector ,
679682 .waiting = & waiting ,
683+ .io = io ,
680684 .descriptor = descriptor ,
681685 .offset = offset ,
682686 .buffer = buffer ,
@@ -705,7 +709,7 @@ VALUE IO_Event_Selector_URing_io_read(VALUE self, VALUE fiber, VALUE io, VALUE b
705709
706710 size_t maximum_size = size - offset ;
707711 while (maximum_size ) {
708- int result = io_read (selector , fiber , descriptor , (char * )base + offset , maximum_size , from );
712+ int result = io_read (selector , fiber , io , descriptor , (char * )base + offset , maximum_size , from );
709713
710714 if (result > 0 ) {
711715 total += result ;
@@ -756,7 +760,7 @@ VALUE IO_Event_Selector_URing_io_pread(VALUE self, VALUE fiber, VALUE io, VALUE
756760
757761 size_t maximum_size = size - offset ;
758762 while (maximum_size ) {
759- int result = io_read (selector , fiber , descriptor , (char * )base + offset , maximum_size , from );
763+ int result = io_read (selector , fiber , io , descriptor , (char * )base + offset , maximum_size , from );
760764
761765 if (result > 0 ) {
762766 total += result ;
@@ -783,6 +787,7 @@ VALUE IO_Event_Selector_URing_io_pread(VALUE self, VALUE fiber, VALUE io, VALUE
783787struct io_write_arguments {
784788 struct IO_Event_Selector_URing * selector ;
785789 struct IO_Event_Selector_URing_Waiting * waiting ;
790+ VALUE io ;
786791 int descriptor ;
787792 off_t offset ;
788793 char * buffer ;
@@ -802,7 +807,7 @@ io_write_submit(VALUE _argument)
802807 io_uring_sqe_set_data (sqe , arguments -> waiting -> completion );
803808 io_uring_submit_pending (selector );
804809
805- IO_Event_Selector_loop_yield (& selector -> backend );
810+ IO_Event_Selector_loop_yield_io (& selector -> backend , arguments -> io );
806811
807812 return RB_INT2NUM (arguments -> waiting -> result );
808813}
@@ -828,7 +833,7 @@ io_write_ensure(VALUE _argument)
828833}
829834
830835static int
831- io_write (struct IO_Event_Selector_URing * selector , VALUE fiber , int descriptor , char * buffer , size_t length , off_t offset )
836+ io_write (struct IO_Event_Selector_URing * selector , VALUE fiber , VALUE io , int descriptor , char * buffer , size_t length , off_t offset )
832837{
833838 struct IO_Event_Selector_URing_Waiting waiting = {
834839 .fiber = fiber ,
@@ -841,6 +846,7 @@ io_write(struct IO_Event_Selector_URing *selector, VALUE fiber, int descriptor,
841846 struct io_write_arguments arguments = {
842847 .selector = selector ,
843848 .waiting = & waiting ,
849+ .io = io ,
844850 .descriptor = descriptor ,
845851 .offset = offset ,
846852 .buffer = buffer ,
@@ -873,7 +879,7 @@ VALUE IO_Event_Selector_URing_io_write(VALUE self, VALUE fiber, VALUE io, VALUE
873879
874880 size_t maximum_size = size - offset ;
875881 while (maximum_size ) {
876- int result = io_write (selector , fiber , descriptor , (char * )base + offset , maximum_size , from );
882+ int result = io_write (selector , fiber , io , descriptor , (char * )base + offset , maximum_size , from );
877883
878884 if (result > 0 ) {
879885 total += result ;
@@ -928,7 +934,7 @@ VALUE IO_Event_Selector_URing_io_pwrite(VALUE self, VALUE fiber, VALUE io, VALUE
928934
929935 size_t maximum_size = size - offset ;
930936 while (maximum_size ) {
931- int result = io_write (selector , fiber , descriptor , (char * )base + offset , maximum_size , from );
937+ int result = io_write (selector , fiber , io , descriptor , (char * )base + offset , maximum_size , from );
932938
933939 if (result > 0 ) {
934940 total += result ;
0 commit comments