Commit 32ff8961 authored by Michael Lippautz's avatar Michael Lippautz Committed by Commit Bot

heap: Add flag for disabling reclamation of unmodified wrappers

Bug: chromium:1107901
Change-Id: Ieacea3dd60e80143a0cbeebf4ab5f91d3888e1a0
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2310351
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Auto-Submit: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68974}
parent 7ca9fc8e
......@@ -1070,6 +1070,9 @@ DEFINE_INT(stress_scavenge, 0,
"percent of the new space capacity")
DEFINE_IMPLICATION(fuzzer_gc_analysis, stress_marking)
DEFINE_IMPLICATION(fuzzer_gc_analysis, stress_scavenge)
DEFINE_BOOL(
reclaim_unmodified_wrappers, true,
"reclaim otherwise unreachable unmodified wrapper objects when possible")
// These flags will be removed after experiments. Do not rely on them.
DEFINE_BOOL(gc_experiment_background_schedule, false,
......
......@@ -1221,6 +1221,8 @@ void GlobalHandles::IterateWeakRootsIdentifyFinalizers(
void GlobalHandles::IdentifyWeakUnmodifiedObjects(
WeakSlotCallback is_unmodified) {
if (!FLAG_reclaim_unmodified_wrappers) return;
LocalEmbedderHeapTracer* const tracer =
isolate()->heap()->local_embedder_heap_tracer();
for (TracedNode* node : traced_young_nodes_) {
......@@ -1254,7 +1256,7 @@ void GlobalHandles::IterateYoungStrongAndDependentRoots(RootVisitor* v) {
}
}
void GlobalHandles::MarkYoungWeakUnmodifiedObjectsPending(
void GlobalHandles::MarkYoungWeakDeadObjectsPending(
WeakSlotCallbackWithHeap is_dead) {
for (Node* node : young_nodes_) {
DCHECK(node->is_in_young_list());
......@@ -1266,8 +1268,7 @@ void GlobalHandles::MarkYoungWeakUnmodifiedObjectsPending(
}
}
void GlobalHandles::IterateYoungWeakUnmodifiedRootsForFinalizers(
RootVisitor* v) {
void GlobalHandles::IterateYoungWeakDeadObjectsForFinalizers(RootVisitor* v) {
for (Node* node : young_nodes_) {
DCHECK(node->is_in_young_list());
if (node->IsWeakRetainer() && (node->state() == Node::PENDING)) {
......@@ -1280,7 +1281,7 @@ void GlobalHandles::IterateYoungWeakUnmodifiedRootsForFinalizers(
}
}
void GlobalHandles::IterateYoungWeakUnmodifiedRootsForPhantomHandles(
void GlobalHandles::IterateYoungWeakObjectsForPhantomHandles(
RootVisitor* v, WeakSlotCallbackWithHeap should_reset_handle) {
for (Node* node : young_nodes_) {
DCHECK(node->is_in_young_list());
......@@ -1305,6 +1306,8 @@ void GlobalHandles::IterateYoungWeakUnmodifiedRootsForPhantomHandles(
}
}
if (!FLAG_reclaim_unmodified_wrappers) return;
LocalEmbedderHeapTracer* const tracer =
isolate()->heap()->local_embedder_heap_tracer();
for (TracedNode* node : traced_young_nodes_) {
......
......@@ -162,12 +162,12 @@ class V8_EXPORT_PRIVATE GlobalHandles final {
void IterateYoungStrongAndDependentRoots(RootVisitor* v);
// Marks weak unmodified handles satisfying |is_dead| as pending.
void MarkYoungWeakUnmodifiedObjectsPending(WeakSlotCallbackWithHeap is_dead);
void MarkYoungWeakDeadObjectsPending(WeakSlotCallbackWithHeap is_dead);
// Iterates over weak independent or unmodified handles.
// See the note above.
void IterateYoungWeakUnmodifiedRootsForFinalizers(RootVisitor* v);
void IterateYoungWeakUnmodifiedRootsForPhantomHandles(
void IterateYoungWeakDeadObjectsForFinalizers(RootVisitor* v);
void IterateYoungWeakObjectsForPhantomHandles(
RootVisitor* v, WeakSlotCallbackWithHeap should_reset_handle);
// Identify unmodified objects that are in weak state and marks them
......
......@@ -5018,14 +5018,12 @@ void MinorMarkCompactCollector::MarkLiveObjects() {
{
TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_MARK_GLOBAL_HANDLES);
isolate()->global_handles()->MarkYoungWeakUnmodifiedObjectsPending(
isolate()->global_handles()->MarkYoungWeakDeadObjectsPending(
&IsUnmarkedObjectForYoungGeneration);
isolate()->global_handles()->IterateYoungWeakUnmodifiedRootsForFinalizers(
isolate()->global_handles()->IterateYoungWeakDeadObjectsForFinalizers(
&root_visitor);
isolate()
->global_handles()
->IterateYoungWeakUnmodifiedRootsForPhantomHandles(
&root_visitor, &IsUnmarkedObjectForYoungGeneration);
isolate()->global_handles()->IterateYoungWeakObjectsForPhantomHandles(
&root_visitor, &IsUnmarkedObjectForYoungGeneration);
DrainMarkingWorklist();
}
......
......@@ -340,17 +340,16 @@ void ScavengerCollector::CollectGarbage() {
// Scavenge weak global handles.
TRACE_GC(heap_->tracer(),
GCTracer::Scope::SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_PROCESS);
isolate_->global_handles()->MarkYoungWeakUnmodifiedObjectsPending(
isolate_->global_handles()->MarkYoungWeakDeadObjectsPending(
&IsUnscavengedHeapObjectSlot);
isolate_->global_handles()->IterateYoungWeakUnmodifiedRootsForFinalizers(
isolate_->global_handles()->IterateYoungWeakDeadObjectsForFinalizers(
&root_scavenge_visitor);
scavengers[kMainThreadId]->Process();
DCHECK(copied_list.IsEmpty());
DCHECK(promotion_list.IsEmpty());
isolate_->global_handles()
->IterateYoungWeakUnmodifiedRootsForPhantomHandles(
&root_scavenge_visitor, &IsUnscavengedHeapObjectSlot);
isolate_->global_handles()->IterateYoungWeakObjectsForPhantomHandles(
&root_scavenge_visitor, &IsUnscavengedHeapObjectSlot);
}
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment