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, ...@@ -1070,6 +1070,9 @@ DEFINE_INT(stress_scavenge, 0,
"percent of the new space capacity") "percent of the new space capacity")
DEFINE_IMPLICATION(fuzzer_gc_analysis, stress_marking) DEFINE_IMPLICATION(fuzzer_gc_analysis, stress_marking)
DEFINE_IMPLICATION(fuzzer_gc_analysis, stress_scavenge) 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. // These flags will be removed after experiments. Do not rely on them.
DEFINE_BOOL(gc_experiment_background_schedule, false, DEFINE_BOOL(gc_experiment_background_schedule, false,
......
...@@ -1221,6 +1221,8 @@ void GlobalHandles::IterateWeakRootsIdentifyFinalizers( ...@@ -1221,6 +1221,8 @@ void GlobalHandles::IterateWeakRootsIdentifyFinalizers(
void GlobalHandles::IdentifyWeakUnmodifiedObjects( void GlobalHandles::IdentifyWeakUnmodifiedObjects(
WeakSlotCallback is_unmodified) { WeakSlotCallback is_unmodified) {
if (!FLAG_reclaim_unmodified_wrappers) return;
LocalEmbedderHeapTracer* const tracer = LocalEmbedderHeapTracer* const tracer =
isolate()->heap()->local_embedder_heap_tracer(); isolate()->heap()->local_embedder_heap_tracer();
for (TracedNode* node : traced_young_nodes_) { for (TracedNode* node : traced_young_nodes_) {
...@@ -1254,7 +1256,7 @@ void GlobalHandles::IterateYoungStrongAndDependentRoots(RootVisitor* v) { ...@@ -1254,7 +1256,7 @@ void GlobalHandles::IterateYoungStrongAndDependentRoots(RootVisitor* v) {
} }
} }
void GlobalHandles::MarkYoungWeakUnmodifiedObjectsPending( void GlobalHandles::MarkYoungWeakDeadObjectsPending(
WeakSlotCallbackWithHeap is_dead) { WeakSlotCallbackWithHeap is_dead) {
for (Node* node : young_nodes_) { for (Node* node : young_nodes_) {
DCHECK(node->is_in_young_list()); DCHECK(node->is_in_young_list());
...@@ -1266,8 +1268,7 @@ void GlobalHandles::MarkYoungWeakUnmodifiedObjectsPending( ...@@ -1266,8 +1268,7 @@ void GlobalHandles::MarkYoungWeakUnmodifiedObjectsPending(
} }
} }
void GlobalHandles::IterateYoungWeakUnmodifiedRootsForFinalizers( void GlobalHandles::IterateYoungWeakDeadObjectsForFinalizers(RootVisitor* v) {
RootVisitor* v) {
for (Node* node : young_nodes_) { for (Node* node : young_nodes_) {
DCHECK(node->is_in_young_list()); DCHECK(node->is_in_young_list());
if (node->IsWeakRetainer() && (node->state() == Node::PENDING)) { if (node->IsWeakRetainer() && (node->state() == Node::PENDING)) {
...@@ -1280,7 +1281,7 @@ void GlobalHandles::IterateYoungWeakUnmodifiedRootsForFinalizers( ...@@ -1280,7 +1281,7 @@ void GlobalHandles::IterateYoungWeakUnmodifiedRootsForFinalizers(
} }
} }
void GlobalHandles::IterateYoungWeakUnmodifiedRootsForPhantomHandles( void GlobalHandles::IterateYoungWeakObjectsForPhantomHandles(
RootVisitor* v, WeakSlotCallbackWithHeap should_reset_handle) { RootVisitor* v, WeakSlotCallbackWithHeap should_reset_handle) {
for (Node* node : young_nodes_) { for (Node* node : young_nodes_) {
DCHECK(node->is_in_young_list()); DCHECK(node->is_in_young_list());
...@@ -1305,6 +1306,8 @@ void GlobalHandles::IterateYoungWeakUnmodifiedRootsForPhantomHandles( ...@@ -1305,6 +1306,8 @@ void GlobalHandles::IterateYoungWeakUnmodifiedRootsForPhantomHandles(
} }
} }
if (!FLAG_reclaim_unmodified_wrappers) return;
LocalEmbedderHeapTracer* const tracer = LocalEmbedderHeapTracer* const tracer =
isolate()->heap()->local_embedder_heap_tracer(); isolate()->heap()->local_embedder_heap_tracer();
for (TracedNode* node : traced_young_nodes_) { for (TracedNode* node : traced_young_nodes_) {
......
...@@ -162,12 +162,12 @@ class V8_EXPORT_PRIVATE GlobalHandles final { ...@@ -162,12 +162,12 @@ class V8_EXPORT_PRIVATE GlobalHandles final {
void IterateYoungStrongAndDependentRoots(RootVisitor* v); void IterateYoungStrongAndDependentRoots(RootVisitor* v);
// Marks weak unmodified handles satisfying |is_dead| as pending. // 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. // Iterates over weak independent or unmodified handles.
// See the note above. // See the note above.
void IterateYoungWeakUnmodifiedRootsForFinalizers(RootVisitor* v); void IterateYoungWeakDeadObjectsForFinalizers(RootVisitor* v);
void IterateYoungWeakUnmodifiedRootsForPhantomHandles( void IterateYoungWeakObjectsForPhantomHandles(
RootVisitor* v, WeakSlotCallbackWithHeap should_reset_handle); RootVisitor* v, WeakSlotCallbackWithHeap should_reset_handle);
// Identify unmodified objects that are in weak state and marks them // Identify unmodified objects that are in weak state and marks them
......
...@@ -5018,14 +5018,12 @@ void MinorMarkCompactCollector::MarkLiveObjects() { ...@@ -5018,14 +5018,12 @@ void MinorMarkCompactCollector::MarkLiveObjects() {
{ {
TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_MARK_GLOBAL_HANDLES); TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_MARK_GLOBAL_HANDLES);
isolate()->global_handles()->MarkYoungWeakUnmodifiedObjectsPending( isolate()->global_handles()->MarkYoungWeakDeadObjectsPending(
&IsUnmarkedObjectForYoungGeneration); &IsUnmarkedObjectForYoungGeneration);
isolate()->global_handles()->IterateYoungWeakUnmodifiedRootsForFinalizers( isolate()->global_handles()->IterateYoungWeakDeadObjectsForFinalizers(
&root_visitor); &root_visitor);
isolate() isolate()->global_handles()->IterateYoungWeakObjectsForPhantomHandles(
->global_handles() &root_visitor, &IsUnmarkedObjectForYoungGeneration);
->IterateYoungWeakUnmodifiedRootsForPhantomHandles(
&root_visitor, &IsUnmarkedObjectForYoungGeneration);
DrainMarkingWorklist(); DrainMarkingWorklist();
} }
......
...@@ -340,17 +340,16 @@ void ScavengerCollector::CollectGarbage() { ...@@ -340,17 +340,16 @@ void ScavengerCollector::CollectGarbage() {
// Scavenge weak global handles. // Scavenge weak global handles.
TRACE_GC(heap_->tracer(), TRACE_GC(heap_->tracer(),
GCTracer::Scope::SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_PROCESS); GCTracer::Scope::SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_PROCESS);
isolate_->global_handles()->MarkYoungWeakUnmodifiedObjectsPending( isolate_->global_handles()->MarkYoungWeakDeadObjectsPending(
&IsUnscavengedHeapObjectSlot); &IsUnscavengedHeapObjectSlot);
isolate_->global_handles()->IterateYoungWeakUnmodifiedRootsForFinalizers( isolate_->global_handles()->IterateYoungWeakDeadObjectsForFinalizers(
&root_scavenge_visitor); &root_scavenge_visitor);
scavengers[kMainThreadId]->Process(); scavengers[kMainThreadId]->Process();
DCHECK(copied_list.IsEmpty()); DCHECK(copied_list.IsEmpty());
DCHECK(promotion_list.IsEmpty()); DCHECK(promotion_list.IsEmpty());
isolate_->global_handles() isolate_->global_handles()->IterateYoungWeakObjectsForPhantomHandles(
->IterateYoungWeakUnmodifiedRootsForPhantomHandles( &root_scavenge_visitor, &IsUnscavengedHeapObjectSlot);
&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