1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

RB_VM_LOCK_ENTER_CR_LEV

This is variant of RB_VM_LOCK_ENTER_LEV, but accept current racotr's
pointer.
This commit is contained in:
Koichi Sasada 2020-12-02 04:10:05 +09:00
parent 23f9447429
commit 554a7180a0
Notes: git 2020-12-07 08:29:09 +09:00
2 changed files with 34 additions and 5 deletions

View file

@ -39,13 +39,12 @@ rb_vm_locked_p(void)
}
static void
vm_lock_enter(rb_vm_t *vm, bool locked, unsigned int *lev APPEND_LOCATION_ARGS)
vm_lock_enter(rb_ractor_t *cr, rb_vm_t *vm, bool locked, unsigned int *lev APPEND_LOCATION_ARGS)
{
if (locked) {
ASSERT_vm_locking();
}
else {
rb_ractor_t *cr = GET_RACTOR();
#if RACTOR_CHECK_MODE
// locking ractor and acquire VM lock will cause deadlock
VM_ASSERT(cr->locked_by != cr->self);
@ -128,7 +127,19 @@ MJIT_FUNC_EXPORTED void
rb_vm_lock_enter_body(unsigned int *lev APPEND_LOCATION_ARGS)
{
rb_vm_t *vm = GET_VM();
vm_lock_enter(vm, vm_locked(vm), lev APPEND_LOCATION_PARAMS);
if (vm_locked(vm)) {
vm_lock_enter(NULL, vm, true, lev APPEND_LOCATION_PARAMS);
}
else {
vm_lock_enter(GET_RACTOR(), vm, false, lev APPEND_LOCATION_PARAMS);
}
}
MJIT_FUNC_EXPORTED void
rb_vm_lock_enter_body_cr(rb_ractor_t *cr, unsigned int *lev APPEND_LOCATION_ARGS)
{
rb_vm_t *vm = GET_VM();
vm_lock_enter(cr, vm, vm_locked(vm), lev APPEND_LOCATION_PARAMS);
}
MJIT_FUNC_EXPORTED void
@ -142,7 +153,8 @@ rb_vm_lock_body(LOCATION_ARGS)
{
rb_vm_t *vm = GET_VM();
ASSERT_vm_unlocking();
vm_lock_enter(vm, false, &vm->ractor.sync.lock_rec APPEND_LOCATION_PARAMS);
vm_lock_enter(GET_RACTOR(), vm, false, &vm->ractor.sync.lock_rec APPEND_LOCATION_PARAMS);
}
void