diff options
Diffstat (limited to 'thread_pthread_mn.c')
| -rw-r--r-- | thread_pthread_mn.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/thread_pthread_mn.c b/thread_pthread_mn.c index d6602cea77..69e81e5fbc 100644 --- a/thread_pthread_mn.c +++ b/thread_pthread_mn.c @@ -394,14 +394,25 @@ nt_free_stack(void *mstack) rb_native_mutex_unlock(&nt_machine_stack_lock); } + static int native_thread_check_and_create_shared(rb_vm_t *vm) { bool need_to_make = false; - ractor_sched_lock(vm, NULL); + rb_native_mutex_lock(&vm->ractor.sched.lock); { - if (need_more_shared_native_threads_p(vm)) { + unsigned int schedulable_ractor_cnt = vm->ractor.cnt; + RUBY_ASSERT(schedulable_ractor_cnt >= 1); + + if (!vm->ractor.main_ractor->threads.sched.enable_mn_threads) + schedulable_ractor_cnt--; // do not need snt for main ractor + + unsigned int snt_cnt = vm->ractor.sched.snt_cnt; + if (((int)snt_cnt < MINIMUM_SNT) || + (snt_cnt < schedulable_ractor_cnt && + snt_cnt < vm->ractor.sched.max_cpu)) { + RUBY_DEBUG_LOG("added snt:%u dnt:%u ractor_cnt:%u grq_cnt:%u", vm->ractor.sched.snt_cnt, vm->ractor.sched.dnt_cnt, @@ -415,7 +426,7 @@ native_thread_check_and_create_shared(rb_vm_t *vm) RUBY_DEBUG_LOG("snt:%d ractor_cnt:%d", (int)vm->ractor.sched.snt_cnt, (int)vm->ractor.cnt); } } - ractor_sched_unlock(vm, NULL); + rb_native_mutex_unlock(&vm->ractor.sched.lock); if (need_to_make) { struct rb_native_thread *nt = native_thread_alloc(); |
