Skip to content

Commit 7290630

Browse files
committed
fix GC.verify_internal_consistency with Parallel Sweep
It also works with RGENGC_CHECK_MODE=1
1 parent f2f9358 commit 7290630

1 file changed

Lines changed: 9 additions & 4 deletions

File tree

gc/default/default.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
66226626
static void
66236627
gc_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

Comments
 (0)