From 7340e7f82780f529d80490045f5ea3e2559d563c Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Thu, 24 Dec 2020 04:29:59 +0900 Subject: introduce rb_ractor_atfork() to reset main ractor at fork(). --- ractor.c | 18 ++++++++++++++++++ ractor_core.h | 1 + thread.c | 8 +++----- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/ractor.c b/ractor.c index 26322f5099..d9a8e07a79 100644 --- a/ractor.c +++ b/ractor.c @@ -1477,6 +1477,24 @@ rb_ractor_main_alloc(void) return r; } +#if defined(HAVE_WORKING_FORK) +void +rb_ractor_atfork(rb_vm_t *vm, rb_thread_t *th) +{ + // initialize as a main ractor + vm->ractor.cnt = 0; + vm->ractor.blocking_cnt = 0; + ruby_single_main_ractor = th->ractor; + th->ractor->status_ = ractor_created; + + rb_ractor_living_threads_init(th->ractor); + rb_ractor_living_threads_insert(th->ractor, th); + + VM_ASSERT(vm->ractor.blocking_cnt == 0); + VM_ASSERT(vm->ractor.cnt == 1); +} +#endif + void rb_gvl_init(rb_global_vm_lock_t *gvl); void diff --git a/ractor_core.h b/ractor_core.h index 4451e06be1..0aa66f65d0 100644 --- a/ractor_core.h +++ b/ractor_core.h @@ -182,6 +182,7 @@ void rb_ractor_terminate_interrupt_main_thread(rb_ractor_t *r); void rb_ractor_terminate_all(void); bool rb_ractor_main_p_(void); void rb_ractor_finish_marking(void); +void rb_ractor_atfork(rb_vm_t *vm, rb_thread_t *th); RUBY_SYMBOL_EXPORT_BEGIN bool rb_ractor_shareable_p_continue(VALUE obj); diff --git a/thread.c b/thread.c index a7cd6e4c28..22b77b7f13 100644 --- a/thread.c +++ b/thread.c @@ -4719,6 +4719,7 @@ rb_clear_coverages(void) } #if defined(HAVE_WORKING_FORK) + static void rb_thread_atfork_internal(rb_thread_t *th, void (*atfork)(rb_thread_t *, const rb_thread_t *)) { @@ -4741,11 +4742,7 @@ rb_thread_atfork_internal(rb_thread_t *th, void (*atfork)(rb_thread_t *, const r } rb_vm_living_threads_init(vm); - // threads - vm->ractor.cnt = 0; - rb_ractor_living_threads_init(th->ractor); - rb_ractor_living_threads_insert(th->ractor, th); - + rb_ractor_atfork(vm, th); /* may be held by MJIT threads in parent */ rb_native_mutex_initialize(&vm->waitpid_lock); @@ -4758,6 +4755,7 @@ rb_thread_atfork_internal(rb_thread_t *th, void (*atfork)(rb_thread_t *, const r rb_ractor_sleeper_threads_clear(th->ractor); rb_clear_coverages(); + VM_ASSERT(vm->ractor.blocking_cnt == 0); VM_ASSERT(vm->ractor.cnt == 1); } -- cgit v1.2.3