Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(939)

Unified Diff: src/heap/incremental-marking.cc

Issue 2202633002: [heap] Drop filler objects on marking deque. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: change dcheck order Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/incremental-marking.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/incremental-marking.cc
diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc
index 4fc68ecc0f14903b886488bfd26e4a760e01c04f..45ffd1aea7fe15a73c18c32f429bc7de63bb90e2 100644
--- a/src/heap/incremental-marking.cc
+++ b/src/heap/incremental-marking.cc
@@ -888,25 +888,24 @@ void IncrementalMarking::MarkObject(Heap* heap, HeapObject* obj) {
}
}
-
-intptr_t IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) {
+intptr_t IncrementalMarking::ProcessMarkingDeque(
+ intptr_t bytes_to_process, ForceCompletionAction completion) {
intptr_t bytes_processed = 0;
- Map* one_pointer_filler_map = heap_->one_pointer_filler_map();
- Map* two_pointer_filler_map = heap_->two_pointer_filler_map();
MarkingDeque* marking_deque =
heap_->mark_compact_collector()->marking_deque();
- while (!marking_deque->IsEmpty() && bytes_processed < bytes_to_process) {
+ while (!marking_deque->IsEmpty() && (bytes_processed < bytes_to_process ||
+ completion == FORCE_COMPLETION)) {
HeapObject* obj = marking_deque->Pop();
- // Explicitly skip one and two word fillers. Incremental markbit patterns
- // are correct only for objects that occupy at least two words.
- // Moreover, slots filtering for left-trimmed arrays works only when
- // the distance between the old array start and the new array start
- // is greater than two if both starts are marked.
- Map* map = obj->map();
- if (map == one_pointer_filler_map || map == two_pointer_filler_map)
+ // Left trimming may result in white filler objects on the marking deque.
+ // Ignore these objects.
+ if (obj->IsFiller()) {
+ DCHECK(Marking::IsImpossible(ObjectMarking::MarkBitFrom(obj)) ||
+ Marking::IsWhite(ObjectMarking::MarkBitFrom(obj)));
continue;
+ }
+ Map* map = obj->map();
int size = obj->SizeFromMap(map);
unscanned_bytes_of_large_object_ = 0;
VisitObject(map, obj, size);
@@ -916,23 +915,6 @@ intptr_t IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) {
}
-void IncrementalMarking::ProcessMarkingDeque() {
- Map* filler_map = heap_->one_pointer_filler_map();
- MarkingDeque* marking_deque =
- heap_->mark_compact_collector()->marking_deque();
- while (!marking_deque->IsEmpty()) {
- HeapObject* obj = marking_deque->Pop();
-
- // Explicitly skip one word fillers. Incremental markbit patterns are
- // correct only for objects that occupy at least two words.
- Map* map = obj->map();
- if (map == filler_map) continue;
-
- VisitObject(map, obj, obj->SizeFromMap(map));
- }
-}
-
-
void IncrementalMarking::Hurry() {
// A scavenge may have pushed new objects on the marking deque (due to black
// allocation) even in COMPLETE state. This may happen if scavenges are
@@ -949,7 +931,7 @@ void IncrementalMarking::Hurry() {
}
// TODO(gc) hurry can mark objects it encounters black as mutator
// was stopped.
- ProcessMarkingDeque();
+ ProcessMarkingDeque(0, FORCE_COMPLETION);
state_ = COMPLETE;
if (FLAG_trace_incremental_marking || FLAG_print_cumulative_gc_stat) {
double end = heap_->MonotonicallyIncreasingTimeInMs();
« no previous file with comments | « src/heap/incremental-marking.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698