From 6d0dd7d86390458e02830684dd45830b5869a7aa Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 23 Apr 2025 07:04:09 +0200 Subject: [PATCH] rb_gc_impl_define_finalizer: unlock on early return --- gc/default/default.c | 1 + gc/mmtk/mmtk.c | 1 + test2.rb | 2 ++ test3.rb | 12 ++++++++++++ 4 files changed, 16 insertions(+) create mode 100644 test2.rb create mode 100644 test3.rb diff --git a/gc/default/default.c b/gc/default/default.c index 1dda258bfd..3b77c14a54 100644 --- a/gc/default/default.c +++ b/gc/default/default.c @@ -2847,6 +2847,7 @@ rb_gc_impl_define_finalizer(void *objspace_ptr, VALUE obj, VALUE block) for (i = 0; i < len; i++) { VALUE recv = RARRAY_AREF(table, i); if (rb_equal(recv, block)) { + rb_gc_vm_unlock(lev); return recv; } } diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index 70df47563d..d74bce79e8 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -986,6 +986,7 @@ rb_gc_impl_define_finalizer(void *objspace_ptr, VALUE obj, VALUE block) for (i = 0; i < len; i++) { VALUE recv = RARRAY_AREF(table, i); if (rb_equal(recv, block)) { + rb_gc_vm_unlock(lev); return recv; } } diff --git a/test2.rb b/test2.rb new file mode 100644 index 0000000000..bab38e5cec --- /dev/null +++ b/test2.rb @@ -0,0 +1,2 @@ +ObjectSpace._id2ref(8) rescue nil + diff --git a/test3.rb b/test3.rb new file mode 100644 index 0000000000..5d54d3fae8 --- /dev/null +++ b/test3.rb @@ -0,0 +1,12 @@ +ractors = 5.times.map do |i| + Ractor.new do + 100_000.times.map do + o = Object.new + ObjectSpace.define_finalizer(o, ->(id) {}) + o + end + end +end + +ractors.each(&:take) +