summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authorSamuel Williams <[email protected]>2025-06-02 05:50:23 -0400
committer<[email protected]>2025-06-02 18:50:23 +0900
commit9a292528305e88fc05c054afcfe25fc23e5c9b80 ()
tree43a37073062b5ac41700546f6a687a49693f371e /thread.c
parent20d7db8cbaa617f58d0d262c354c76460a6ad809 (diff)
Fix compatibility with fiber schedulers that don't implement `#fiber_interrupt`. (#13492)
Notes: Merged-By: ioquatix <[email protected]>
-rw-r--r--thread.c35
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;