summaryrefslogtreecommitdiff
path: root/ujit_core.c
diff options
context:
space:
mode:
authorMaxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>2021-01-20 12:44:24 -0500
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:27 -0400
commitcf4021ca780d460dc351b30260532c158a5c8a5e (patch)
tree91e829f76b5a0146377ee8803afe61bca9c84ab3 /ujit_core.c
parentdde69ab5c63a01c20c9bc19b7a11d9c64f6dab2a (diff)
downloadruby-cf4021ca780d460dc351b30260532c158a5c8a5e.tar.gz
Take VM lock in branch_stub_hit(), fix ractor deadlock.
Diffstat (limited to 'ujit_core.c')
-rw-r--r--ujit_core.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/ujit_core.c b/ujit_core.c
index 6f51440b86..2ca4550a71 100644
--- a/ujit_core.c
+++ b/ujit_core.c
@@ -3,6 +3,7 @@
#include "builtin.h"
#include "insns.inc"
#include "insns_info.inc"
+#include "vm_sync.h"
#include "ujit_asm.h"
#include "ujit_utils.h"
#include "ujit_iface.h"
@@ -162,7 +163,7 @@ uint8_t* gen_entry_point(const rb_iseq_t *iseq, uint32_t insn_idx)
{
// The entry context makes no assumptions about types
blockid_t blockid = { iseq, insn_idx };
- ctx_t ctx = { 0 };
+ ctx_t ctx = { { 0 }, 0 };
// Write the interpreter entry prologue
uint8_t* code_ptr = ujit_entry_prologue();
@@ -183,6 +184,10 @@ uint8_t* gen_entry_point(const rb_iseq_t *iseq, uint32_t insn_idx)
// Triggers compilation of branches and code patching
uint8_t* branch_stub_hit(uint32_t branch_idx, uint32_t target_idx)
{
+ uint8_t* dst_addr;
+
+ RB_VM_LOCK_ENTER();
+
assert (branch_idx < num_branches);
assert (target_idx < 2);
branch_t *branch = &branch_entries[branch_idx];
@@ -217,7 +222,7 @@ uint8_t* branch_stub_hit(uint32_t branch_idx, uint32_t target_idx)
add_incoming(p_block, branch_idx);
// Update the branch target address
- uint8_t* dst_addr = cb_get_ptr(cb, p_block->start_pos);
+ dst_addr = cb_get_ptr(cb, p_block->start_pos);
branch->dst_addrs[target_idx] = dst_addr;
// Rewrite the branch with the new jump target address
@@ -230,6 +235,8 @@ uint8_t* branch_stub_hit(uint32_t branch_idx, uint32_t target_idx)
branch->end_pos = cb->write_pos;
cb_set_pos(cb, cur_pos);
+ RB_VM_LOCK_LEAVE();
+
// Return a pointer to the compiled block version
return dst_addr;
}