Fix Thread#join(timeout) when running inside the fiber scheduler. (#7903)

This commit is contained in:
Samuel Williams 2023-06-03 12:41:36 +09:00 committed by GitHub
parent a4d92475f6
commit 0402193723
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
Notes: git 2023-06-03 03:42:01 +00:00
Merged-By: ioquatix <samuel@codeotaku.com>
2 changed files with 27 additions and 0 deletions

View File

@ -20,6 +20,28 @@ class TestFiberThread < Test::Unit::TestCase
assert_equal :done, thread.value
end
def test_thread_join_timeout
sleeper = nil
thread = Thread.new do
scheduler = Scheduler.new
Fiber.set_scheduler scheduler
Fiber.schedule do
sleeper = Thread.new{sleep}
sleeper.join(0.1)
end
scheduler.run
end
thread.join
assert_predicate sleeper, :alive?
ensure
sleeper&.kill
end
def test_thread_join_implicit
sleeping = false
finished = false

View File

@ -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;
}