Reviewers: Hannes Payer,
Description:
When scanning for grey objects, fill the deque until it flows over
If we just fill it until it is full, and EmptyMarkingDeque() manages it
to process without overflowing it, then ProcessMarkingDeque() will not
scan for additional grey objects.
BUG=none
[email protected]
LOG=n
Please review this at https://codereview.chromium.org/997093002/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+14, -14 lines):
M src/heap/mark-compact.cc
Index: src/heap/mark-compact.cc
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
index
44262e42b162b58974cf7b2092ea141047856d2a..83c2cd28714e59852f0dd70ae13f07d464fd36c5
100644
--- a/src/heap/mark-compact.cc
+++ b/src/heap/mark-compact.cc
@@ -1764,7 +1764,7 @@ static void DiscoverGreyObjectsWithIterator(Heap*
heap,
T* it) {
// The caller should ensure that the marking stack is initially not full,
// so that we don't waste effort pointlessly scanning for objects.
- DCHECK(!marking_deque->IsFull());
+ DCHECK(!marking_deque->overflowed());
Map* filler_map = heap->one_pointer_filler_map();
for (HeapObject* object = it->Next(); object != NULL; object =
it->Next()) {
@@ -1773,7 +1773,7 @@ static void DiscoverGreyObjectsWithIterator(Heap*
heap,
Marking::GreyToBlack(markbit);
MemoryChunk::IncrementLiveBytesFromGC(object->address(),
object->Size());
marking_deque->PushBlack(object);
- if (marking_deque->IsFull()) return;
+ if (marking_deque->overflowed()) return;
}
}
}
@@ -1784,7 +1784,7 @@ static inline int MarkWordToObjectStarts(uint32_t
mark_bits, int* starts);
static void DiscoverGreyObjectsOnPage(MarkingDeque* marking_deque,
MemoryChunk* p) {
- DCHECK(!marking_deque->IsFull());
+ DCHECK(!marking_deque->overflowed());
DCHECK(strcmp(Marking::kWhiteBitPattern, "00") == 0);
DCHECK(strcmp(Marking::kBlackBitPattern, "10") == 0);
DCHECK(strcmp(Marking::kGreyBitPattern, "11") == 0);
@@ -1818,7 +1818,7 @@ static void DiscoverGreyObjectsOnPage(MarkingDeque*
marking_deque,
HeapObject* object = HeapObject::FromAddress(addr);
MemoryChunk::IncrementLiveBytesFromGC(object->address(),
object->Size());
marking_deque->PushBlack(object);
- if (marking_deque->IsFull()) return;
+ if (marking_deque->overflowed()) return;
offset += 2;
grey_objects >>= 2;
}
@@ -1896,7 +1896,7 @@ static void DiscoverGreyObjectsInSpace(Heap* heap,
MarkingDeque* marking_deque,
while (it.has_next()) {
Page* p = it.next();
DiscoverGreyObjectsOnPage(marking_deque, p);
- if (marking_deque->IsFull()) return;
+ if (marking_deque->overflowed()) return;
}
}
@@ -1908,7 +1908,7 @@ static void DiscoverGreyObjectsInNewSpace(Heap* heap,
while (it.has_next()) {
NewSpacePage* page = it.next();
DiscoverGreyObjectsOnPage(marking_deque, page);
- if (marking_deque->IsFull()) return;
+ if (marking_deque->overflowed()) return;
}
}
@@ -2034,31 +2034,31 @@ void MarkCompactCollector::RefillMarkingDeque() {
DCHECK(marking_deque_.overflowed());
DiscoverGreyObjectsInNewSpace(heap(), &marking_deque_);
- if (marking_deque_.IsFull()) return;
+ if (marking_deque_.overflowed()) return;
DiscoverGreyObjectsInSpace(heap(), &marking_deque_,
heap()->old_pointer_space());
- if (marking_deque_.IsFull()) return;
+ if (marking_deque_.overflowed()) return;
DiscoverGreyObjectsInSpace(heap(), &marking_deque_,
heap()->old_data_space());
- if (marking_deque_.IsFull()) return;
+ if (marking_deque_.overflowed()) return;
DiscoverGreyObjectsInSpace(heap(), &marking_deque_,
heap()->code_space());
- if (marking_deque_.IsFull()) return;
+ if (marking_deque_.overflowed()) return;
DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->map_space());
- if (marking_deque_.IsFull()) return;
+ if (marking_deque_.overflowed()) return;
DiscoverGreyObjectsInSpace(heap(), &marking_deque_,
heap()->cell_space());
- if (marking_deque_.IsFull()) return;
+ if (marking_deque_.overflowed()) return;
DiscoverGreyObjectsInSpace(heap(), &marking_deque_,
heap()->property_cell_space());
- if (marking_deque_.IsFull()) return;
+ if (marking_deque_.overflowed()) return;
LargeObjectIterator lo_it(heap()->lo_space());
DiscoverGreyObjectsWithIterator(heap(), &marking_deque_, &lo_it);
- if (marking_deque_.IsFull()) return;
+ if (marking_deque_.overflowed()) return;
marking_deque_.ClearOverflowed();
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.