Skip to content

Commit 7ac16ef

Browse files
committed
Adjust snt < max_cpu calculation
[Bug #20146] Previously we dealt with the main Ractor not being enabled for M:N by incrementing snt_cnt++. This worked for comparing against ractor count, but meant that we always had one less SNT than was specified by RUBY_MAX_CPU. This was notably a problem for RUBY_MAX_CPU=1, which would cause Ractors to hang. This commit instead of adjusting snt, adjusts a "schedulable_ractor_cnt". This way snt_cnt will actually reach RUBY_MAX_CPU.
1 parent acb29f7 commit 7ac16ef

2 files changed

Lines changed: 14 additions & 3 deletions

File tree

test/ruby/test_ractor.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,13 @@ def ractor_job(job_count, array_size)
202202
RUBY
203203
end
204204

205+
# [Bug #20146]
206+
def test_max_cpu_1
207+
assert_ractor(<<~'RUBY', args: [{ "RUBY_MAX_CPU" => "1" }])
208+
assert_equal :ok, Ractor.new { :ok }.value
209+
RUBY
210+
end
211+
205212
def assert_make_shareable(obj)
206213
refute Ractor.shareable?(obj), "object was already shareable"
207214
Ractor.make_shareable(obj)

thread_pthread_mn.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,15 @@ native_thread_check_and_create_shared(rb_vm_t *vm)
397397

398398
rb_native_mutex_lock(&vm->ractor.sched.lock);
399399
{
400-
unsigned int snt_cnt = vm->ractor.sched.snt_cnt;
401-
if (!vm->ractor.main_ractor->threads.sched.enable_mn_threads) snt_cnt++; // do not need snt for main ractor
400+
unsigned int schedulable_ractor_cnt = vm->ractor.cnt;
401+
RUBY_ASSERT(schedulable_ractor_cnt >= 1);
402+
403+
if (!vm->ractor.main_ractor->threads.sched.enable_mn_threads)
404+
schedulable_ractor_cnt--; // do not need snt for main ractor
402405

406+
unsigned int snt_cnt = vm->ractor.sched.snt_cnt;
403407
if (((int)snt_cnt < MINIMUM_SNT) ||
404-
(snt_cnt < vm->ractor.cnt &&
408+
(snt_cnt < schedulable_ractor_cnt &&
405409
snt_cnt < vm->ractor.sched.max_cpu)) {
406410

407411
RUBY_DEBUG_LOG("added snt:%u dnt:%u ractor_cnt:%u grq_cnt:%u",

0 commit comments

Comments
 (0)