diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-12-24 04:29:59 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-12-24 04:30:50 +0900 |
commit | 7340e7f82780f529d80490045f5ea3e2559d563c (patch) | |
tree | 5d0784a0de345d637e1c211c6558f53b81a3308a | |
parent | 7fcb6b3dbe7517fe5426fdb6871cd4940a71b7e8 (diff) |
introduce rb_ractor_atfork()
to reset main ractor at fork().
-rw-r--r-- | ractor.c | 18 | ||||
-rw-r--r-- | ractor_core.h | 1 | ||||
-rw-r--r-- | thread.c | 8 |
3 files changed, 22 insertions, 5 deletions
@@ -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); @@ -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); } |