Skip to content

Commit 7340e7f

Browse files
committed
introduce rb_ractor_atfork()
to reset main ractor at fork().
1 parent 7fcb6b3 commit 7340e7f

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

ractor.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,6 +1477,24 @@ rb_ractor_main_alloc(void)
14771477
return r;
14781478
}
14791479

1480+
#if defined(HAVE_WORKING_FORK)
1481+
void
1482+
rb_ractor_atfork(rb_vm_t *vm, rb_thread_t *th)
1483+
{
1484+
// initialize as a main ractor
1485+
vm->ractor.cnt = 0;
1486+
vm->ractor.blocking_cnt = 0;
1487+
ruby_single_main_ractor = th->ractor;
1488+
th->ractor->status_ = ractor_created;
1489+
1490+
rb_ractor_living_threads_init(th->ractor);
1491+
rb_ractor_living_threads_insert(th->ractor, th);
1492+
1493+
VM_ASSERT(vm->ractor.blocking_cnt == 0);
1494+
VM_ASSERT(vm->ractor.cnt == 1);
1495+
}
1496+
#endif
1497+
14801498
void rb_gvl_init(rb_global_vm_lock_t *gvl);
14811499

14821500
void

ractor_core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ void rb_ractor_terminate_interrupt_main_thread(rb_ractor_t *r);
182182
void rb_ractor_terminate_all(void);
183183
bool rb_ractor_main_p_(void);
184184
void rb_ractor_finish_marking(void);
185+
void rb_ractor_atfork(rb_vm_t *vm, rb_thread_t *th);
185186

186187
RUBY_SYMBOL_EXPORT_BEGIN
187188
bool rb_ractor_shareable_p_continue(VALUE obj);

thread.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4719,6 +4719,7 @@ rb_clear_coverages(void)
47194719
}
47204720

47214721
#if defined(HAVE_WORKING_FORK)
4722+
47224723
static void
47234724
rb_thread_atfork_internal(rb_thread_t *th, void (*atfork)(rb_thread_t *, const rb_thread_t *))
47244725
{
@@ -4741,11 +4742,7 @@ rb_thread_atfork_internal(rb_thread_t *th, void (*atfork)(rb_thread_t *, const r
47414742
}
47424743
rb_vm_living_threads_init(vm);
47434744

4744-
// threads
4745-
vm->ractor.cnt = 0;
4746-
rb_ractor_living_threads_init(th->ractor);
4747-
rb_ractor_living_threads_insert(th->ractor, th);
4748-
4745+
rb_ractor_atfork(vm, th);
47494746

47504747
/* may be held by MJIT threads in parent */
47514748
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
47584755
rb_ractor_sleeper_threads_clear(th->ractor);
47594756
rb_clear_coverages();
47604757

4758+
VM_ASSERT(vm->ractor.blocking_cnt == 0);
47614759
VM_ASSERT(vm->ractor.cnt == 1);
47624760
}
47634761

0 commit comments

Comments
 (0)