summaryrefslogtreecommitdiff
path: root/vm_sync.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-12-02 04:10:05 +0900
committerKoichi Sasada <ko1@atdot.net>2020-12-07 08:28:36 +0900
commit554a7180a0aad85bee5cb8ed41d99d16dab304e7 (patch)
treef0bb8a75d926265af53dd37ff01224560a41226a /vm_sync.c
parent23f9447429a1bbb262aa19afd9a2a1ad0eba8ca6 (diff)
RB_VM_LOCK_ENTER_CR_LEV
This is variant of RB_VM_LOCK_ENTER_LEV, but accept current racotr's pointer.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3842
Diffstat (limited to 'vm_sync.c')
-rw-r--r--vm_sync.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/vm_sync.c b/vm_sync.c
index 1ab6c9055a..8eb2cdf1e9 100644
--- a/vm_sync.c
+++ b/vm_sync.c
@@ -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