@@ -6402,6 +6402,7 @@ struct verify_internal_consistency_struct {
64026402 int err_count ;
64036403 size_t live_object_count ;
64046404 size_t zombie_object_count ;
6405+ size_t zombie_ran_finalizer_object_count ;
64056406
64066407 VALUE parent ;
64076408 size_t old_object_count ;
@@ -6457,7 +6458,6 @@ verify_internal_consistency_i(void *page_start, void *page_end, size_t stride,
64576458{
64586459 VALUE obj ;
64596460 rb_objspace_t * objspace = data -> objspace ;
6460- return 0 ; // FIXME for parallel sweep
64616461
64626462 for (obj = (VALUE )page_start ; obj != (VALUE )page_end ; obj += stride ) {
64636463 asan_unpoisoning_object (obj ) {
@@ -6499,7 +6499,11 @@ verify_internal_consistency_i(void *page_start, void *page_end, size_t stride,
64996499 if (BUILTIN_TYPE (obj ) == T_ZOMBIE ) {
65006500 data -> zombie_object_count ++ ;
65016501
6502- if ((RBASIC (obj )-> flags & ~ZOMBIE_OBJ_KEPT_FLAGS ) != T_ZOMBIE ) {
6502+ if (FL_TEST (obj , ZOMBIE_NEEDS_FREE_FLAG )) {
6503+ data -> zombie_ran_finalizer_object_count ++ ;
6504+ }
6505+
6506+ if ((RBASIC (obj )-> flags & ~(ZOMBIE_OBJ_KEPT_FLAGS |ZOMBIE_NEEDS_FREE_FLAG )) != T_ZOMBIE ) {
65036507 fprintf (stderr , "verify_internal_consistency_i: T_ZOMBIE has extra flags set: %s\n" ,
65046508 rb_obj_info (obj ));
65056509 data -> err_count ++ ;
@@ -6622,7 +6626,6 @@ gc_verify_heap_pages(rb_objspace_t *objspace)
66226626static void
66236627gc_verify_internal_consistency_ (rb_objspace_t * objspace )
66246628{
6625- return ; // FIXME for parallel sweep
66266629 struct verify_internal_consistency_struct data = {0 };
66276630
66286631 data .objspace = objspace ;
@@ -6637,6 +6640,7 @@ gc_verify_internal_consistency_(rb_objspace_t *objspace)
66376640 uintptr_t end = start + page -> total_slots * slot_size ;
66386641
66396642 verify_internal_consistency_i ((void * )start , (void * )end , slot_size , & data );
6643+ data .live_object_count += (page -> pre_freed_slots + page -> pre_final_slots + page -> pre_zombie_slots );
66406644 }
66416645
66426646 if (data .err_count != 0 ) {
@@ -6689,7 +6693,7 @@ gc_verify_internal_consistency_(rb_objspace_t *objspace)
66896693 }
66906694
66916695 if (total_final_slots_count (objspace ) != data .zombie_object_count ||
6692- total_final_slots_count ( objspace ) != list_count ) {
6696+ ( data . zombie_object_count - data . zombie_ran_finalizer_object_count ) != list_count ) {
66936697
66946698 rb_bug ("inconsistent finalizing object count:\n"
66956699 " expect %" PRIuSIZE "\n"
@@ -6714,6 +6718,7 @@ gc_verify_internal_consistency(void *objspace_ptr)
67146718 rb_gc_vm_barrier (); // stop other ractors
67156719
67166720 unsigned int prev_during_gc = during_gc ;
6721+ wait_for_background_sweeping_to_finish (objspace , true, false, "verify_internal_consistency" );
67176722 during_gc = FALSE; // stop gc here
67186723 {
67196724 gc_verify_internal_consistency_ (objspace );
0 commit comments