From c3ba3fa8d01aa3970dc1f4e3dc0090ae171e9e35 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Wed, 14 Oct 2020 02:03:21 +0900 Subject: support exception when lock_rec > 0 If a ractor getting a VM lock (monitor) raises an exception, unlock can be skipped. To release VM lock correctly on exception (or other jumps with JUMP_TAG), EC_POP_TAG() releases VM lock. --- vm_core.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'vm_core.h') diff --git a/vm_core.h b/vm_core.h index 44f85ff3a0..f783bd5b99 100644 --- a/vm_core.h +++ b/vm_core.h @@ -794,6 +794,7 @@ struct rb_vm_tag { rb_jmpbuf_t buf; struct rb_vm_tag *prev; enum ruby_tag_type state; + int lock_rec; }; STATIC_ASSERT(rb_vm_tag_buf_offset, offsetof(struct rb_vm_tag, buf) > 0); @@ -1797,6 +1798,19 @@ rb_current_vm(void) return ruby_current_vm_ptr; } +static inline int +rb_ec_vm_lock_rec(rb_execution_context_t *ec) +{ + rb_vm_t *vm = rb_ec_vm_ptr(ec); + + if (vm->ractor.sync.lock_owner != rb_ec_ractor_ptr(ec)) { + return 0; + } + else { + return vm->ractor.sync.lock_rec; + } +} + #else #error "unsupported thread model" #endif -- cgit v1.2.3