summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc/default/default.c1
-rw-r--r--gc/mmtk/mmtk.c1
-rw-r--r--test2.rb2
-rw-r--r--test3.rb12
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)
+