support nested VM barrier synchronization

on `RGENGC_CHECK_MODE > 1`, there are the following steps

1. gc_enter
2. vm_barrier
3. verify_internal_consistency
4. vm_barrier

and it causes nested vm_barrier synchronization.

This patch allows such cases.
This commit is contained in:
Koichi Sasada 2025-06-04 06:41:39 +09:00
parent 1a991131a0
commit a62166e28e
Notes: git 2025-06-05 21:49:22 +00:00

View File

@ -226,6 +226,16 @@ rb_vm_cond_timedwait(rb_vm_t *vm, rb_nativethread_cond_t *cond, unsigned long ms
vm_cond_wait(vm, cond, msec);
}
static bool
vm_barrier_acquired_p(const rb_vm_t *vm, const rb_ractor_t *cr)
{
#ifdef RUBY_THREAD_PTHREAD_H
return vm->ractor.sched.barrier_ractor == cr;
#else
return false;
#endif
}
void
rb_vm_barrier(void)
{
@ -237,13 +247,20 @@ rb_vm_barrier(void)
}
else {
rb_vm_t *vm = GET_VM();
VM_ASSERT(!vm->ractor.sched.barrier_waiting);
ASSERT_vm_locking();
rb_ractor_t *cr = vm->ractor.sync.lock_owner;
ASSERT_vm_locking();
VM_ASSERT(cr == GET_RACTOR());
VM_ASSERT(rb_ractor_status_p(cr, ractor_running));
rb_ractor_sched_barrier_start(vm, cr);
if (vm_barrier_acquired_p(vm, cr)) {
// already in barrier synchronization
return;
}
else {
VM_ASSERT(!vm->ractor.sched.barrier_waiting);
rb_ractor_sched_barrier_start(vm, cr);
}
}
}