aboutsummaryrefslogtreecommitdiffstats
path: root/thread.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2023-06-03 12:41:36 +0900
committerGitHub <noreply@github.com>2023-06-03 12:41:36 +0900
commit0402193723647b8c4f57b1453fe2192ad2788d12 (patch)
tree93f20957e7e0f3ee0f5af206fa4a481e21790539 /thread.c
parenta4d92475f69f0ca3dba0f497253e600c7f90a0ad (diff)
downloadruby-0402193723647b8c4f57b1453fe2192ad2788d12.tar.gz
Fix `Thread#join(timeout)` when running inside the fiber scheduler. (#7903)
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/thread.c b/thread.c
index e521d13fb5..5dc0c269f2 100644
--- a/thread.c
+++ b/thread.c
@@ -1053,6 +1053,10 @@ thread_join_sleep(VALUE arg)
if (scheduler != Qnil) {
rb_fiber_scheduler_block(scheduler, target_th->self, p->timeout);
+ // Check if the target thread is finished after blocking:
+ if (thread_finished(target_th)) break;
+ // Otherwise, a timeout occurred:
+ else return Qfalse;
}
else if (!limit) {
sleep_forever(th, SLEEP_DEADLOCKABLE | SLEEP_ALLOW_SPURIOUS | SLEEP_NO_CHECKINTS);
@@ -1070,6 +1074,7 @@ thread_join_sleep(VALUE arg)
RUBY_DEBUG_LOG("interrupted target_th:%u status:%s", rb_th_serial(target_th), thread_status_name(target_th, TRUE));
}
+
return Qtrue;
}