aboutsummaryrefslogtreecommitdiffstats
path: root/thread.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2022-10-20 13:38:52 +1300
committerGitHub <noreply@github.com>2022-10-20 13:38:52 +1300
commit7f175e564875b011efb43537907867dd08d659e8 (patch)
treeb382a58d414e0c0014285958099a531d35e80086 /thread.c
parentd9d9005a3a31d0df0b5432eba5d6f2b9bd647cb1 (diff)
downloadruby-7f175e564875b011efb43537907867dd08d659e8.tar.gz
Avoid missed wakeup with fiber scheduler and Fiber.blocking. (#6588)
* Ensure that blocked fibers don't prevent valid wakeups.
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c4
1 files changed, 2 insertions, 2 deletions
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;