diff --git a/gc.c b/gc.c.new index 0a72b53..79b8031 100644 --- a/gc.c +++ b/gc.c.new @@ -629,6 +629,7 @@ VALUE *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress; #define nomem_error GET_VM()->special_exceptions[ruby_error_nomemory] +int disable_deferred = 0; int ruby_gc_debug_indent = 0; VALUE rb_mGC; int ruby_disable_gc_stress = 0; @@ -2057,10 +2058,11 @@ finalize_deferred(rb_objspace_t *objspace) { RVALUE *p = heap_pages_deferred_final; heap_pages_deferred_final = 0; - + disable_deferred = 1; if (p) { finalize_list(objspace, p); } + disable_deferred = 0; } static void @@ -2711,7 +2713,7 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_ if (obj_free(objspace, (VALUE)p)) { final_slots++; } - else if (FL_TEST(p, FL_FINALIZE)) { + else if (FL_TEST(p, FL_FINALIZE) && !disable_deferred) { RDATA(p)->dfree = 0; make_deferred(objspace,p); final_slots++;