From f8ddcecbdf34b8d33ed4311b34d498d4ff380a3e Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 12 Dec 2023 10:45:59 -0500 Subject: [PATCH] [Bug #20061] Clear mark bits when rb_free_on_exit When compiling with cppflags=-DRGENGC_CHECK_MODE, the following crashes: ``` $ RUBY_FREE_ON_EXIT=1 ./miniruby -e 0 -e: [BUG] obj_free: RVALUE_MARKED(0x0000000103570020 [3LM ] T_CLASS (anon)) != FALSE ``` This commit clears the mark bits when rb_free_on_exit is enabled. --- gc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gc.c b/gc.c index a8a55377d8b445..59c9162a8947ec 100644 --- a/gc.c +++ b/gc.c @@ -4651,6 +4651,14 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace) /* Abort incremental marking and lazy sweeping to speed up shutdown. */ gc_abort(objspace); + if (rb_free_on_exit) { + for (int i = 0; i < SIZE_POOL_COUNT; i++) { + rb_size_pool_t *size_pool = &size_pools[i]; + rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); + rgengc_mark_and_rememberset_clear(objspace, heap); + } + } + /* prohibit GC because force T_DATA finalizers can break an object graph consistency */ dont_gc_on();