summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2024-08-14 11:31:17 -0400
committerPeter Zhu <[email protected]>2024-08-14 13:49:52 -0400
commit0610f1b083738bb0a84cede42fda048fa116404e (patch)
treea6ccd4d3747a09cc17fd81bfc3649a6894aa832f /test
parent85f99b382857af1e3c14e0edfdb4eb0ab6774996 (diff)
Fix crash when GC runs during finalizers at shutdown
We need to remove from the finalizer_table after running all the finalizers because GC could trigger during the finalizer which could reclaim the finalizer table array. The following code crashes: 1_000_000.times do o = Object.new ObjectSpace.define_finalizer(o, proc { }) end
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/11375
Diffstat (limited to 'test')
-rw-r--r--test/ruby/test_objectspace.rb14
1 files changed, 14 insertions, 0 deletions
diff --git a/test/ruby/test_objectspace.rb b/test/ruby/test_objectspace.rb
index 1c97bd517e..d3ce6e6ed5 100644
--- a/test/ruby/test_objectspace.rb
+++ b/test/ruby/test_objectspace.rb
@@ -101,6 +101,20 @@ End
ObjectSpace.define_finalizer(a) { p :ok }
!b
END
+
+ assert_in_out_err(["-e", <<~RUBY], "", %w(:ok :ok), [])
+ a = Object.new
+ ObjectSpace.define_finalizer(a) { p :ok }
+
+ 1_000_000.times do
+ o = Object.new
+ ObjectSpace.define_finalizer(o) { }
+ end
+
+ b = Object.new
+ ObjectSpace.define_finalizer(b) { p :ok }
+ RUBY
+
assert_raise(ArgumentError) { ObjectSpace.define_finalizer([], Object.new) }
code = proc do |priv|