8000 Disable GC even during finalizing · github/ruby@868d63f · GitHub
[go: up one dir, main page]

Skip to content

Commit 868d63f

Browse files
committed
Disable GC even during finalizing
We're seeing a crash during shutdown in rb_gc_impl_objspace_free because it's running lazy sweeping during shutdown. It appears that it's due to `finalizing` being set, which causes GC to not be aborted and not disabled which causes it to be in lazy sweeping at shutdown. The full stack trace is: #6 rb_bug (fmt=fmt@entry=0x5643b8ebde78 "lazy sweeping underway when freeing object space") at error.c:1095 #7 0x00005643b8a3c697 in rb_gc_impl_objspace_free (objspace_ptr=<optimized out>) at gc/default.c:9507 #8 0x00005643b8c269eb in ruby_vm_destruct (vm=0x7e2fdc84d000) at vm.c:3141 #9 0x00005643b8a5147b in rb_ec_cleanup (ec=<optimized out>, ex=<optimized out>) at eval.c:263 #10 0x00005643b8a51c93 in ruby_run_node (n=<optimized out>) at eval.c:319 #11 0x00005643b8a4c7c7 in rb_main (argv=0x7fffef15e7f8, argc=18) at ./main.c:43 #12 main (argc=<optimized out>, argv=<optimized out>) at ./main.c:62
1 parent da8cf99 commit 868d63f

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

gc/default.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3233,11 +3233,17 @@ rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr)
32333233
#if RGENGC_CHECK_MODE >= 2
32343234
gc_verify_internal_consistency(objspace);
32353235
#endif
3236-
if (RUBY_ATOMIC_EXCHANGE(finalizing, 1)) return;
32373236

32383237
/* prohibit incremental GC */
32393238
objspace->flags.dont_incremental = 1;
32403239

3240+
if (RUBY_ATOMIC_EXCHANGE(finalizing, 1)) {
3241+
/* Abort incremental marking and lazy sweeping to speed up shutdown. */
3242+
gc_abort(objspace);
3243+
dont_gc_on();
3244+
return;
3245+
}
3246+
32413247
/* force to run finalizer */
32423248
while (finalizer_table->num_entries) {
32433249
struct force_finalize_list *list = 0;

0 commit comments

Comments
 (0)
0