From 5f69a7f60467fa58c2f998daffab43e118bff36c Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Tue, 9 Feb 2021 19:39:56 +1300 Subject: Expose scheduler as public interface & bug fixes. (#3945) * Rename `rb_scheduler` to `rb_fiber_scheduler`. * Use public interface if available. * Use `rb_check_funcall` where possible. * Don't use `unblock` unless the fiber was non-blocking. --- thread.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'thread.c') diff --git a/thread.c b/thread.c index e3689487ce..1e35ad4e1c 100644 --- a/thread.c +++ b/thread.c @@ -81,7 +81,7 @@ #include "internal/io.h" #include "internal/object.h" #include "internal/proc.h" -#include "internal/scheduler.h" +#include "ruby/fiber/scheduler.h" #include "internal/signal.h" #include "internal/thread.h" #include "internal/time.h" @@ -551,8 +551,8 @@ rb_threadptr_join_list_wakeup(rb_thread_t *thread) while (join_list) { rb_thread_t *target_thread = join_list->thread; - if (target_thread->scheduler != Qnil) { - rb_scheduler_unblock(target_thread->scheduler, target_thread->self, rb_fiberptr_self(join_list->fiber)); + if (target_thread->scheduler != Qnil && rb_fiberptr_blocking(join_list->fiber) == 0) { + rb_fiber_scheduler_unblock(target_thread->scheduler, target_thread->self, rb_fiberptr_self(join_list->fiber)); } else { rb_threadptr_interrupt(target_thread); @@ -772,7 +772,7 @@ thread_do_start(rb_thread_t *th) rb_bug("unreachable"); } - rb_scheduler_set(Qnil); + rb_fiber_scheduler_set(Qnil); } void rb_ec_clear_current_thread_trace_func(const rb_execution_context_t *ec); @@ -1178,10 +1178,10 @@ thread_join_sleep(VALUE arg) } while (target_th->status != THREAD_KILLED) { - VALUE scheduler = rb_scheduler_current(); + VALUE scheduler = rb_fiber_scheduler_current(); if (scheduler != Qnil) { - rb_scheduler_block(scheduler, target_th->self, p->timeout); + rb_fiber_scheduler_block(scheduler, target_th->self, p->timeout); } else if (!limit) { th->status = THREAD_STOPPED_FOREVER; rb_ractor_sleeper_threads_inc(th->ractor); @@ -1525,9 +1525,9 @@ rb_thread_sleep_interruptible(void) static void rb_thread_sleep_deadly_allow_spurious_wakeup(VALUE blocker) { - VALUE scheduler = rb_scheduler_current(); + VALUE scheduler = rb_fiber_scheduler_current(); if (scheduler != Qnil) { - rb_scheduler_block(scheduler, blocker, Qnil); + rb_fiber_scheduler_block(scheduler, blocker, Qnil); } else { thread_debug("rb_thread_sleep_deadly_allow_spurious_wakeup\n"); sleep_forever(GET_THREAD(), SLEEP_DEADLOCKABLE); -- cgit v1.2.1