summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKoichi Sasada <[email protected]>2020-10-14 02:03:21 +0900
committerKoichi Sasada <[email protected]>2020-10-14 14:02:06 +0900
commitc3ba3fa8d01aa3970dc1f4e3dc0090ae171e9e35 ()
tree7aaff45d1eb07dc41297d1661f528a5449609469
parentd7de342e414b29bea7eff444ae33e44445afb9a5 (diff)
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.
Notes: Merged: https://.com/ruby/ruby/pull/3654
-rw-r--r--eval_intern.h14
-rw-r--r--vm_core.h14
-rw-r--r--vm_sync.c22
3 files changed, 49 insertions, 1 deletions
@@ -127,14 +127,26 @@ LONG WINAPI rb_w32_stack_overflow_handler(struct _EXCEPTION_POINTERS *);
rb_fiber_start(); \
} while (0)
#define EC_PUSH_TAG(ec) do { \
rb_execution_context_t * const _ec = (ec); \
struct rb_vm_tag _tag; \
_tag.state = TAG_NONE; \
_tag.tag = Qundef; \
- _tag.prev = _ec->tag;
#define EC_POP_TAG() \
_ec->tag = _tag.prev; \
} while (0)
@@ -794,6 +794,7 @@ struct rb_vm_tag {
rb_jmpbuf_t buf;
struct rb_vm_tag *prev;
enum ruby_tag_type state;
};
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;
}
#else
#error "unsupported thread model"
#endif
@@ -246,3 +246,25 @@ rb_vm_barrier(void)
}
}
}