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:
parent
1a991131a0
commit
a62166e28e
Notes:
git
2025-06-05 21:49:22 +00:00
21
vm_sync.c
21
vm_sync.c
@ -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,14 +247,21 @@ 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));
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
x
Reference in New Issue
Block a user