Skip to content

Commit d8117e1

Browse files
rmacnak-googleCommit Queue
authored andcommitted
[vm] Finer labeling of roots in heap snapshots.
Add missing object id zone roots, which should have been part of ffbbdb5 when they switched from weak to strong. TEST=examine snapshot after using inspect Bug: #61036 Change-Id: I3bea765e4ae487babfd86eccbaa87bab80320dcf Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439160 Reviewed-by: Alexander Aprelev <[email protected]> Commit-Queue: Ryan Macnak <[email protected]>
1 parent cc5f351 commit d8117e1

File tree

13 files changed

+193
-130
lines changed

13 files changed

+193
-130
lines changed

runtime/vm/heap/become.cc

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -365,15 +365,6 @@ void Become::FollowForwardingPointers(Thread* thread) {
365365
// C++ pointers.
366366
isolate_group->VisitObjectPointers(&pointer_visitor,
367367
ValidationPolicy::kValidateFrames);
368-
#ifndef PRODUCT
369-
isolate_group->ForEachIsolate(
370-
[&](Isolate* isolate) {
371-
for (intptr_t i = 0; i < isolate->NumServiceIdZones(); ++i) {
372-
isolate->GetServiceIdZone(i)->VisitPointers(pointer_visitor);
373-
}
374-
},
375-
/*at_safepoint=*/true);
376-
#endif // !PRODUCT
377368

378369
// Weak persistent handles.
379370
ForwardHeapPointersHandleVisitor handle_visitor;

runtime/vm/heap/compactor.cc

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -469,19 +469,6 @@ void CompactorTask::RunEnteredIsolateGroup() {
469469
isolate_group_->VisitWeakPersistentHandles(compactor_);
470470
break;
471471
}
472-
#ifndef PRODUCT
473-
case 4: {
474-
TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardObjectIdRing");
475-
isolate_group_->ForEachIsolate(
476-
[&](Isolate* isolate) {
477-
for (intptr_t i = 0; i < isolate->NumServiceIdZones(); ++i) {
478-
isolate->GetServiceIdZone(i)->VisitPointers(*compactor_);
479-
}
480-
},
481-
/*at_safepoint=*/true);
482-
break;
483-
}
484-
#endif // !PRODUCT
485472
default:
486473
more_forwarding_tasks = false;
487474
}

runtime/vm/heap/incremental_compactor.cc

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,6 @@ class EpilogueState {
574574
bool TakeOOM() { return oom_slice_.exchange(false); }
575575
bool TakeWeakHandles() { return weak_handles_slice_.exchange(false); }
576576
bool TakeWeakTables() { return weak_tables_slice_.exchange(false); }
577-
bool TakeIdRing() { return id_ring_slice_.exchange(false); }
578577
bool TakeRoots() { return roots_slice_.exchange(false); }
579578
bool TakeResetProgressBars() {
580579
return reset_progress_bars_slice_.exchange(false);
@@ -634,18 +633,6 @@ class EpilogueTask : public SafepointTask {
634633
TIMELINE_FUNCTION_GC_DURATION(thread, "WeakTables");
635634
isolate_group_->heap()->ForwardWeakTables(&visitor);
636635
}
637-
#ifndef PRODUCT
638-
if (state_->TakeIdRing()) {
639-
TIMELINE_FUNCTION_GC_DURATION(thread, "IdRing");
640-
isolate_group_->ForEachIsolate(
641-
[&](Isolate* isolate) {
642-
for (intptr_t i = 0; i < isolate->NumServiceIdZones(); ++i) {
643-
isolate->GetServiceIdZone(i)->VisitPointers(visitor);
644-
}
645-
},
646-
/*at_safepoint=*/true);
647-
}
648-
#endif // !PRODUCT
649636

650637
barrier_->Sync();
651638

runtime/vm/heap/marker.cc

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -751,8 +751,7 @@ void GCMarker::Epilogue() {}
751751

752752
enum RootSlices {
753753
kIsolate = 0,
754-
kObjectIdRing = 1,
755-
kNumFixedRootSlices = 2,
754+
kNumFixedRootSlices = 1,
756755
};
757756

758757
void GCMarker::ResetSlices() {
@@ -774,18 +773,13 @@ void GCMarker::IterateRoots(ObjectPointerVisitor* visitor) {
774773

775774
switch (slice) {
776775
case kIsolate: {
776+
// TODO(gc): Split this by isolate?
777777
TIMELINE_FUNCTION_GC_DURATION(Thread::Current(),
778778
"ProcessIsolateGroupRoots");
779779
isolate_group_->VisitObjectPointers(
780780
visitor, ValidationPolicy::kDontValidateFrames);
781781
break;
782782
}
783-
case kObjectIdRing: {
784-
TIMELINE_FUNCTION_GC_DURATION(Thread::Current(),
785-
"ProcessObjectIdTable");
786-
isolate_group_->VisitPointersInAllServiceIdZones(*visitor);
787-
break;
788-
}
789783
}
790784

791785
MonitorLocker ml(&root_slices_monitor_);

runtime/vm/heap/scavenger.cc

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,33 +1192,22 @@ void Scavenger::IterateRememberedCards(ScavengerVisitor* visitor) {
11921192
heap_->old_space()->VisitRememberedCards(visitor);
11931193
}
11941194

1195-
void Scavenger::IterateObjectIdTable(ObjectPointerVisitor* visitor) {
1196-
#ifndef PRODUCT
1197-
TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "IterateObjectIdTable");
1198-
heap_->isolate_group()->VisitPointersInAllServiceIdZones(*visitor);
1199-
#endif // !PRODUCT
1200-
}
1201-
12021195
enum RootSlices {
12031196
kIsolate = 0,
1204-
kObjectIdRing,
1205-
kNumRootSlices,
1197+
kNumFixedRootSlices = 1,
12061198
};
12071199

12081200
void Scavenger::IterateRoots(ScavengerVisitor* visitor) {
12091201
for (;;) {
12101202
intptr_t slice = root_slices_started_.fetch_add(1);
1211-
if (slice >= kNumRootSlices) {
1203+
if (slice >= kNumFixedRootSlices) {
12121204
break; // No more slices.
12131205
}
1214-
12151206
switch (slice) {
12161207
case kIsolate:
1208+
// TODO(gc): Split this by isolate?
12171209
IterateIsolateRoots(visitor);
12181210
break;
1219-
case kObjectIdRing:
1220-
IterateObjectIdTable(visitor);
1221-
break;
12221211
default:
12231212
UNREACHABLE();
12241213
}

runtime/vm/heap/scavenger.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,6 @@ class Scavenger {
281281
void IterateIsolateRoots(ObjectPointerVisitor* visitor);
282282
void IterateStoreBuffers(ScavengerVisitor* visitor);
283283
void IterateRememberedCards(ScavengerVisitor* visitor);
284-
void IterateObjectIdTable(ObjectPointerVisitor* visitor);
285284
void IterateRoots(ScavengerVisitor* visitor);
286285
void IterateWeak();
287286
void MournWeakHandles();

runtime/vm/isolate.cc

Lines changed: 83 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2935,53 +2935,95 @@ void IsolateGroup::VisitObjectPointers(ObjectPointerVisitor* visitor,
29352935
VisitStackPointers(visitor, validate_frames);
29362936
}
29372937

2938-
void IsolateGroup::VisitSharedPointers(ObjectPointerVisitor* visitor) {
2939-
// Visit objects in the class table.
2940-
class_table()->VisitObjectPointers(visitor);
2941-
if (heap_walk_class_table() != class_table()) {
2942-
heap_walk_class_table()->VisitObjectPointers(visitor);
2943-
}
2944-
api_state()->VisitObjectPointersUnlocked(visitor);
2945-
// Visit objects in the object store.
2946-
if (object_store() != nullptr) {
2947-
object_store()->VisitObjectPointers(visitor);
2948-
}
2949-
visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&saved_unlinked_calls_));
2950-
initial_field_table()->VisitObjectPointers(visitor);
2951-
sentinel_field_table()->VisitObjectPointers(visitor);
2952-
shared_initial_field_table()->VisitObjectPointers(visitor);
2953-
shared_field_table()->VisitObjectPointers(visitor);
2954-
2955-
// Visit the boxed_field_list_.
2956-
// 'boxed_field_list_' access via mutator and background compilation threads
2957-
// is guarded with a monitor. This means that we can visit it only
2958-
// when at safepoint or the field_list_mutex_ lock has been taken.
2959-
visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&boxed_field_list_));
2960-
2961-
NOT_IN_PRECOMPILED(background_compiler()->VisitPointers(visitor));
2962-
2938+
void IsolateGroup::VisitSharedPointers(ObjectPointerVisitor* visitor,
2939+
intptr_t slice) {
2940+
switch (slice) {
2941+
case kClassTable:
2942+
class_table()->VisitObjectPointers(visitor);
2943+
if (heap_walk_class_table() != class_table()) {
2944+
heap_walk_class_table()->VisitObjectPointers(visitor);
2945+
}
2946+
break;
2947+
case kApiState:
2948+
api_state()->VisitObjectPointersUnlocked(visitor);
2949+
break;
2950+
case kObjectStore:
2951+
if (object_store() != nullptr) {
2952+
object_store()->VisitObjectPointers(visitor);
2953+
}
2954+
break;
2955+
case kSavedUnlinkedCalls:
2956+
visitor->VisitPointer(
2957+
reinterpret_cast<ObjectPtr*>(&saved_unlinked_calls_));
2958+
break;
2959+
case kInitialFieldTable:
2960+
initial_field_table()->VisitObjectPointers(visitor);
2961+
break;
2962+
case kSentinelFieldTable:
2963+
sentinel_field_table()->VisitObjectPointers(visitor);
2964+
break;
2965+
case kSharedInitialFieldTable:
2966+
shared_initial_field_table()->VisitObjectPointers(visitor);
2967+
break;
2968+
case kSharedFieldTable:
2969+
shared_field_table()->VisitObjectPointers(visitor);
2970+
break;
2971+
case kBoxedFieldList:
2972+
// Visit the boxed_field_list_.
2973+
// 'boxed_field_list_' access via mutator and background compilation
2974+
// threads is guarded with a monitor. This means that we can visit it only
2975+
// when at safepoint or the field_list_mutex_ lock has been taken.
2976+
visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&boxed_field_list_));
2977+
break;
2978+
case kBackgroundCompiler:
2979+
NOT_IN_PRECOMPILED(background_compiler()->VisitPointers(visitor));
2980+
break;
2981+
case kDebugger:
29632982
#if !defined(PRODUCT)
2964-
if (debugger() != nullptr) {
2965-
debugger()->VisitObjectPointers(visitor);
2966-
}
2983+
if (debugger() != nullptr) {
2984+
debugger()->VisitObjectPointers(visitor);
2985+
}
29672986
#endif
2968-
2987+
break;
2988+
case kReloadContext:
29692989
#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
2970-
// Visit objects that are being used for isolate reload.
2971-
if (program_reload_context() != nullptr) {
2972-
program_reload_context()->VisitObjectPointers(visitor);
2973-
program_reload_context()->group_reload_context()->VisitObjectPointers(
2974-
visitor);
2975-
}
2990+
if (program_reload_context() != nullptr) {
2991+
program_reload_context()->VisitObjectPointers(visitor);
2992+
program_reload_context()->group_reload_context()->VisitObjectPointers(
2993+
visitor);
2994+
}
29762995
#endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
2977-
2978-
if (source()->loaded_blobs_ != nullptr) {
2979-
visitor->VisitPointer(
2980-
reinterpret_cast<ObjectPtr*>(&(source()->loaded_blobs_)));
2996+
break;
2997+
case kLoadedBlobs:
2998+
if (source()->loaded_blobs_ != nullptr) {
2999+
visitor->VisitPointer(
3000+
reinterpret_cast<ObjectPtr*>(&(source()->loaded_blobs_)));
3001+
}
3002+
break;
3003+
case kBecome:
3004+
if (become() != nullptr) {
3005+
become()->VisitObjectPointers(visitor);
3006+
}
3007+
break;
3008+
case kObjectIdZones:
3009+
#if !defined(PRODUCT)
3010+
if (visitor->trace_object_id_rings()) {
3011+
for (Isolate* isolate : isolates_) {
3012+
for (intptr_t i = 0; i < isolate->NumServiceIdZones(); ++i) {
3013+
isolate->GetServiceIdZone(i)->VisitPointers(visitor);
3014+
}
3015+
}
3016+
}
3017+
#endif // !defined(PRODUCT)
3018+
break;
3019+
default:
3020+
UNREACHABLE();
29813021
}
3022+
}
29823023

2983-
if (become() != nullptr) {
2984-
become()->VisitObjectPointers(visitor);
3024+
void IsolateGroup::VisitSharedPointers(ObjectPointerVisitor* visitor) {
3025+
for (intptr_t i = 0; i < kNumRootSlices; i++) {
3026+
VisitSharedPointers(visitor, static_cast<RootSlice>(i));
29853027
}
29863028
}
29873029

@@ -3002,17 +3044,6 @@ void IsolateGroup::VisitStackPointers(ObjectPointerVisitor* visitor,
30023044
visitor->clear_gc_root_type();
30033045
}
30043046

3005-
void IsolateGroup::VisitPointersInAllServiceIdZones(
3006-
ObjectPointerVisitor& visitor) {
3007-
#if !defined(PRODUCT)
3008-
for (Isolate* isolate : isolates_) {
3009-
for (intptr_t i = 0; i < isolate->NumServiceIdZones(); ++i) {
3010-
isolate->GetServiceIdZone(i)->VisitPointers(visitor);
3011-
}
3012-
}
3013-
#endif // !defined(PRODUCT)
3014-
}
3015-
30163047
void IsolateGroup::VisitWeakPersistentHandles(HandleVisitor* visitor) {
30173048
api_state()->VisitWeakHandlesUnlocked(visitor);
30183049
}

runtime/vm/isolate.h

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,63 @@ class MutatorThreadPool : public ThreadPool {
262262
IsolateGroup* isolate_group_ = nullptr;
263263
};
264264

265+
enum RootSlice : intptr_t {
266+
kClassTable,
267+
kApiState,
268+
kObjectStore,
269+
kSavedUnlinkedCalls,
270+
kInitialFieldTable,
271+
kSentinelFieldTable,
272+
kSharedInitialFieldTable,
273+
kSharedFieldTable,
274+
kBoxedFieldList,
275+
kBackgroundCompiler,
276+
kDebugger,
277+
kReloadContext,
278+
kLoadedBlobs,
279+
kBecome,
280+
kObjectIdZones,
281+
282+
kNumRootSlices,
283+
};
284+
285+
inline const char* RootSliceToCString(intptr_t slice) {
286+
switch (slice) {
287+
case kClassTable:
288+
return "class table";
289+
case kApiState:
290+
return "api state";
291+
case kObjectStore:
292+
return "group object store";
293+
case kSavedUnlinkedCalls:
294+
return "saved unlinked calls";
295+
case kInitialFieldTable:
296+
return "initial field table";
297+
case kSentinelFieldTable:
298+
return "sentinel field table";
299+
case kSharedInitialFieldTable:
300+
return "shared initial field table";
301+
case kSharedFieldTable:
302+
return "shared field table";
303+
case kBoxedFieldList:
304+
return "boxed field list";
305+
case kBackgroundCompiler:
306+
return "background compiler";
307+
case kDebugger:
308+
return "debugger";
309+
case kReloadContext:
310+
return "reload context";
311+
case kLoadedBlobs:
312+
return "loaded blobs";
313+
case kBecome:
314+
return "become";
315+
case kObjectIdZones:
316+
return "object id zones";
317+
default:
318+
return "?";
319+
}
320+
}
321+
265322
// Represents an isolate group and is shared among all isolates within a group.
266323
class IsolateGroup : public IntrusiveDListEntry<IsolateGroup> {
267324
public:
@@ -692,9 +749,9 @@ class IsolateGroup : public IntrusiveDListEntry<IsolateGroup> {
692749
void VisitObjectPointers(ObjectPointerVisitor* visitor,
693750
ValidationPolicy validate_frames);
694751
void VisitSharedPointers(ObjectPointerVisitor* visitor);
752+
void VisitSharedPointers(ObjectPointerVisitor* visitor, intptr_t slice);
695753
void VisitStackPointers(ObjectPointerVisitor* visitor,
696754
ValidationPolicy validate_frames);
697-
void VisitPointersInAllServiceIdZones(ObjectPointerVisitor& visitor);
698755
void VisitWeakPersistentHandles(HandleVisitor* visitor);
699756

700757
// In precompilation we finalize all regular classes before compiling.

0 commit comments

Comments
 (0)