diff options
author | Samuel Williams <[email protected]> | 2025-06-02 05:50:23 -0400 |
---|---|---|
committer | <[email protected]> | 2025-06-02 18:50:23 +0900 |
commit | 9a292528305e88fc05c054afcfe25fc23e5c9b80 () | |
tree | 43a37073062b5ac41700546f6a687a49693f371e /thread.c | |
parent | 20d7db8cbaa617f58d0d262c354c76460a6ad809 (diff) |
Fix compatibility with fiber schedulers that don't implement `#fiber_interrupt`. (#13492)
Notes: Merged-By: ioquatix <[email protected]>
-rw-r--r-- | thread.c | 35 |
1 files changed, 26 insertions, 9 deletions
@@ -1721,6 +1721,12 @@ rb_io_blocking_operation_enter(struct rb_io *io, struct rb_io_blocking_operation ccan_list_add(rb_io_blocking_operations(io), &blocking_operation->list); } struct io_blocking_operation_arguments { struct rb_io *io; struct rb_io_blocking_operation *blocking_operation; @@ -1732,7 +1738,7 @@ io_blocking_operation_exit(VALUE _arguments) struct io_blocking_operation_arguments *arguments = (void*)_arguments; struct rb_io_blocking_operation *blocking_operation = arguments->blocking_operation; - ccan_list_del(&blocking_operation->list); rb_io_t *io = arguments->io; rb_thread_t *thread = io->closing_ec->thread_ptr; @@ -1763,6 +1769,9 @@ rb_io_blocking_operation_exit(struct rb_io *io, struct rb_io_blocking_operation { VALUE wakeup_mutex = io->wakeup_mutex; if (RB_TEST(wakeup_mutex)) { struct io_blocking_operation_arguments arguments = { .io = io, @@ -1772,7 +1781,8 @@ rb_io_blocking_operation_exit(struct rb_io *io, struct rb_io_blocking_operation rb_mutex_synchronize(wakeup_mutex, io_blocking_operation_exit, (VALUE)&arguments); } else { - ccan_list_del(&blocking_operation->list); } } @@ -1809,7 +1819,7 @@ rb_thread_io_blocking_operation(VALUE self, VALUE(*function)(VALUE), VALUE argum struct rb_io_blocking_operation blocking_operation = { .ec = ec, }; - ccan_list_add(&io->blocking_operations, &blocking_operation.list); struct io_blocking_operation_arguments io_blocking_operation_arguments = { .io = io, @@ -2765,13 +2775,20 @@ thread_io_close_notify_all(VALUE _io) ccan_list_for_each(rb_io_blocking_operations(io), blocking_operation, list) { rb_execution_context_t *ec = blocking_operation->ec; - rb_thread_t *thread = ec->thread_ptr; - if (thread->scheduler != Qnil) { - rb_fiber_scheduler_fiber_interrupt(thread->scheduler, rb_fiberptr_self(ec->fiber_ptr), error); - } else { - rb_threadptr_pending_interrupt_enque(thread, error); - rb_threadptr_interrupt(thread); } count += 1; |