@@ -32,7 +32,6 @@ struct IO_Event_Selector_URing
3232{
3333 struct IO_Event_Selector backend ;
3434 struct io_uring ring ;
35- size_t pending ;
3635
3736 // Flag indicating whether the selector is currently blocked in a system call.
3837 // Set to 1 when blocked in io_uring_wait_cqe_timeout() without GVL, 0 otherwise.
@@ -239,7 +238,6 @@ VALUE IO_Event_Selector_URing_allocate(VALUE self) {
239238 IO_Event_Selector_initialize (& selector -> backend , self , Qnil );
240239 selector -> ring .ring_fd = -1 ;
241240
242- selector -> pending = 0 ;
243241 selector -> blocked = 0 ;
244242 selector -> interrupt .descriptor = -1 ;
245243 selector -> wakeup_registered = 0 ;
@@ -421,15 +419,14 @@ void IO_Event_Selector_URing_dump_completion_queue(struct IO_Event_Selector_URin
421419// Flush the submission queue, optionally yielding if unsuccessful.
422420static
423421int io_uring_submit_all (struct IO_Event_Selector_URing * selector , bool yield ) {
424- while (selector -> pending > 0 ) {
422+ struct io_uring * ring = & selector -> ring ;
423+
424+ while (io_uring_sq_ready (ring ) > 0 ) {
425425 int result = io_uring_submit (& selector -> ring );
426426
427- if (result >= 0 ) {
428- // io_uring_submit() returns the number of submitted SQEs
429- selector -> pending -= result ;
430- } else if (result == - EBUSY || result == - EAGAIN ) {
427+ if (result == - EBUSY || result == - EAGAIN ) {
431428 if (yield ) IO_Event_Selector_yield (& selector -> backend );
432- } else {
429+ } else if ( result < 0 ) {
433430 rb_syserr_fail (- result , "io_uring_submit_all:io_uring_submit" );
434431 return result ;
435432 }
@@ -442,23 +439,32 @@ int io_uring_submit_all(struct IO_Event_Selector_URing *selector, bool yield) {
442439// Flush the submission queue if pending operations are present.
443440static
444441int io_uring_submit_flush (struct IO_Event_Selector_URing * selector ) {
445- if (DEBUG ) fprintf (stderr , "io_uring_submit_now(pending=%ld)\n" , selector -> pending );
442+ if (DEBUG ) {
443+ unsigned pending = io_uring_sq_ready (& selector -> ring );
444+ fprintf (stderr , "io_uring_submit_flush(pending=%u)\n" , pending );
445+ }
446446
447447 return io_uring_submit_all (selector , false);
448448}
449449
450450// Immediately flush the submission queue, yielding to the event loop if it was not successful.
451451static
452452int io_uring_submit_now (struct IO_Event_Selector_URing * selector ) {
453- if (DEBUG ) fprintf (stderr , "io_uring_submit_now(pending=%ld)\n" , selector -> pending );
454-
453+ if (DEBUG ) {
454+ unsigned pending = io_uring_sq_ready (& selector -> ring );
455+ fprintf (stderr , "io_uring_submit_now(pending=%u)\n" , pending );
456+ }
457+
455458 return io_uring_submit_all (selector , true);
456459}
457460
458461// Submit a pending operation. This does not submit the operation immediately, but instead defers it to the next call to `io_uring_submit_flush` or `io_uring_submit_now`. This is useful for operations that are not urgent, but should be used with care as it can lead to a deadlock if the submission queue is not flushed.
459462static
460463void io_uring_submit_pending (struct IO_Event_Selector_URing * selector ) {
461- if (DEBUG ) fprintf (stderr , "io_uring_submit_pending(ring=%p, pending=%ld)\n" , & selector -> ring , selector -> pending );
464+ if (DEBUG ) {
465+ unsigned pending = io_uring_sq_ready (& selector -> ring );
466+ fprintf (stderr , "io_uring_submit_pending(ring=%p, pending=%u)\n" , & selector -> ring , pending );
467+ }
462468}
463469
464470struct io_uring_sqe * io_get_sqe (struct IO_Event_Selector_URing * selector ) {
@@ -471,7 +477,6 @@ struct io_uring_sqe * io_get_sqe(struct IO_Event_Selector_URing *selector) {
471477 sqe = io_uring_get_sqe (& selector -> ring );
472478 }
473479
474- selector -> pending += 1 ;
475480 return sqe ;
476481}
477482
0 commit comments