summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ractor.c18
-rw-r--r--ractor_core.h1
-rw-r--r--thread.c8
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);
}