diff options
-rw-r--r-- | gc/default/default.c | 1 | ||||
-rw-r--r-- | gc/mmtk/mmtk.c | 1 | ||||
-rw-r--r-- | test2.rb | 2 | ||||
-rw-r--r-- | test3.rb | 12 |
4 files changed, 16 insertions, 0 deletions
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) + |