From 2268dc2ea6c534383c38b8ec64bf7b821cb3580d Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Wed, 7 May 2025 00:19:36 +0900 Subject: [PATCH 1/4] YJIT: ZJIT: Allow both JITs in the same build This commit allows building YJIT and ZJIT simultaneously, a "combo build". Previously, `./configure --enable-yjit --enable-zjit` failed. At runtime, though, only one of the two can be enabled at a time. Add a root Cargo workspace that contains both the yjit and zjit crate. The common Rust build integration mechanisms are factored out into defs/jit.mk. Combo YJIT+ZJIT dev builds are supported; if either JIT uses `--enable-*=dev`, both of them are built in dev mode. The combo build requires Cargo, but building one JIT at a time with only rustc in release build remains supported. --- gc/mmtk/Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gc/mmtk/Cargo.toml b/gc/mmtk/Cargo.toml index 66af77f..c3f46aa 100644 --- a/gc/mmtk/Cargo.toml +++ b/gc/mmtk/Cargo.toml @@ -35,3 +35,5 @@ default = [] # When moving an object, clear its original copy. clear_old_copy = [] + +[workspace] From c6f3a2ee4ef87df2bf6fc5de3c6fe05f8be23027 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 15 May 2025 13:00:18 +0200 Subject: [PATCH 2/4] Add missing lock in `rb_gc_impl_undefine_finalizer` The table is global so accesses must be synchronized. --- gc/mmtk/mmtk.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index 59bef82..aec48df 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -966,7 +966,11 @@ rb_gc_impl_undefine_finalizer(void *objspace_ptr, VALUE obj) struct objspace *objspace = objspace_ptr; st_data_t data = obj; + + int lev = rb_gc_vm_lock(); st_delete(objspace->finalizer_table, &data, 0); + rb_gc_vm_unlock(lev); + FL_UNSET(obj, FL_FINALIZE); } From ec8db248d3bab5062138b17a26caa6b03bbbabbc Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 15 May 2025 13:43:44 +0200 Subject: [PATCH 3/4] Add missing lock to `rb_gc_impl_copy_finalizer` --- gc/mmtk/mmtk.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index aec48df..09a8c0b 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -983,6 +983,7 @@ rb_gc_impl_copy_finalizer(void *objspace_ptr, VALUE dest, VALUE obj) if (!FL_TEST(obj, FL_FINALIZE)) return; + int lev = rb_gc_vm_lock(); if (RB_LIKELY(st_lookup(objspace->finalizer_table, obj, &data))) { table = (VALUE)data; st_insert(objspace->finalizer_table, dest, table); @@ -991,6 +992,7 @@ rb_gc_impl_copy_finalizer(void *objspace_ptr, VALUE dest, VALUE obj) else { rb_bug("rb_gc_copy_finalizer: FL_FINALIZE set but not found in finalizer_table: %s", rb_obj_info(obj)); } + rb_gc_vm_unlock(lev); } static int From b8edf3a5cddf724cd1e00b95464c796de1f22859 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 15 May 2025 14:04:36 +0200 Subject: [PATCH 4/4] rb_gc_impl_copy_finalizer: generate a new object id Fix a regression introduced by: https://github.com/ruby/ruby/pull/13155 --- gc/mmtk/mmtk.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index 09a8c0b..70cd5f4 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -985,7 +985,8 @@ rb_gc_impl_copy_finalizer(void *objspace_ptr, VALUE dest, VALUE obj) int lev = rb_gc_vm_lock(); if (RB_LIKELY(st_lookup(objspace->finalizer_table, obj, &data))) { - table = (VALUE)data; + table = rb_ary_dup((VALUE)data); + RARRAY_ASET(table, 0, rb_obj_id(dest)); st_insert(objspace->finalizer_table, dest, table); FL_SET(dest, FL_FINALIZE); }