From 7f175e564875b011efb43537907867dd08d659e8 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Thu, 20 Oct 2022 13:38:52 +1300 Subject: Avoid missed wakeup with fiber scheduler and Fiber.blocking. (#6588) * Ensure that blocked fibers don't prevent valid wakeups. --- thread.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'thread.c') diff --git a/thread.c b/thread.c index e1b194861a..d8925e618e 100644 --- a/thread.c +++ b/thread.c @@ -404,7 +404,7 @@ rb_threadptr_join_list_wakeup(rb_thread_t *thread) rb_thread_t *target_thread = join_list->thread; - if (target_thread->scheduler != Qnil && rb_fiberptr_blocking(join_list->fiber) == 0) { + if (target_thread->scheduler != Qnil && join_list->fiber) { rb_fiber_scheduler_unblock(target_thread->scheduler, target_thread->self, rb_fiberptr_self(join_list->fiber)); } else { @@ -1091,7 +1091,7 @@ thread_join(rb_thread_t *target_th, VALUE timeout, rb_hrtime_t *limit) struct rb_waiting_list waiter; waiter.next = target_th->join_list; waiter.thread = th; - waiter.fiber = fiber; + waiter.fiber = rb_fiberptr_blocking(fiber) ? NULL : fiber; target_th->join_list = &waiter; struct join_arg arg; -- cgit v1.2.1