summaryrefslogtreecommitdiff
path: root/yjit.c
diff options
context:
space:
mode:
authorTatsuya Kawano <tatsuya@hibaridb.org>2022-10-18 00:26:36 +0800
committerGitHub <noreply@github.com>2022-10-17 12:26:36 -0400
commit07a93b1e378bf2ea356b0561e5e89e60d30fc684 (patch)
treecc3ed40fb50267ef8844f11ea37b693d81c157d9 /yjit.c
parentad3d210beab9d162b96e2601aa3ad896785b831b (diff)
downloadruby-07a93b1e378bf2ea356b0561e5e89e60d30fc684.tar.gz
YJIT: Do not call `mprotect` when `mem_size` is zero (#6563)
This allows x86_64 based YJIT to run on Docker Desktop on Apple silicon (arm64) Mac because it will avoid a subtle behavior difference in `mprotect` system call between the Linux kernel and `qemu-x86_64` user space emulator.
Diffstat (limited to 'yjit.c')
-rw-r--r--yjit.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/yjit.c b/yjit.c
index 838956f7b4..a53e2ca709 100644
--- a/yjit.c
+++ b/yjit.c
@@ -74,6 +74,11 @@ rb_yjit_mark_writable(void *mem_block, uint32_t mem_size)
void
rb_yjit_mark_executable(void *mem_block, uint32_t mem_size)
{
+ // Do not call mprotect when mem_size is zero. Some platforms may return
+ // an error for it. https://github.com/Shopify/ruby/issues/450
+ if (mem_size == 0) {
+ return;
+ }
if (mprotect(mem_block, mem_size, PROT_READ | PROT_EXEC)) {
rb_bug("Couldn't make JIT page (%p, %lu bytes) executable, errno: %s\n",
mem_block, (unsigned long)mem_size, strerror(errno));