Commit 42c82d5e authored by hpayer@chromium.org's avatar hpayer@chromium.org

Do not iterate the new space on marking deque overflow.

BUG=
R=mstarzinger@chromium.org

Review URL: https://codereview.chromium.org/18238008

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15567 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent a9fd01d5
...@@ -1931,7 +1931,8 @@ static void DiscoverGreyObjectsWithIterator(Heap* heap, ...@@ -1931,7 +1931,8 @@ static void DiscoverGreyObjectsWithIterator(Heap* heap,
static inline int MarkWordToObjectStarts(uint32_t mark_bits, int* starts); static inline int MarkWordToObjectStarts(uint32_t mark_bits, int* starts);
static void DiscoverGreyObjectsOnPage(MarkingDeque* marking_deque, Page* p) { static void DiscoverGreyObjectsOnPage(MarkingDeque* marking_deque,
MemoryChunk* p) {
ASSERT(!marking_deque->IsFull()); ASSERT(!marking_deque->IsFull());
ASSERT(strcmp(Marking::kWhiteBitPattern, "00") == 0); ASSERT(strcmp(Marking::kWhiteBitPattern, "00") == 0);
ASSERT(strcmp(Marking::kBlackBitPattern, "10") == 0); ASSERT(strcmp(Marking::kBlackBitPattern, "10") == 0);
...@@ -2005,6 +2006,18 @@ static void DiscoverGreyObjectsInSpace(Heap* heap, ...@@ -2005,6 +2006,18 @@ static void DiscoverGreyObjectsInSpace(Heap* heap,
} }
static void DiscoverGreyObjectsInNewSpace(Heap* heap,
MarkingDeque* marking_deque) {
NewSpace* space = heap->new_space();
NewSpacePageIterator it(space->bottom(), space->top());
while (it.has_next()) {
NewSpacePage* page = it.next();
DiscoverGreyObjectsOnPage(marking_deque, page);
if (marking_deque->IsFull()) return;
}
}
bool MarkCompactCollector::IsUnmarkedHeapObject(Object** p) { bool MarkCompactCollector::IsUnmarkedHeapObject(Object** p) {
Object* o = *p; Object* o = *p;
if (!o->IsHeapObject()) return false; if (!o->IsHeapObject()) return false;
...@@ -2111,8 +2124,7 @@ void MarkCompactCollector::EmptyMarkingDeque() { ...@@ -2111,8 +2124,7 @@ void MarkCompactCollector::EmptyMarkingDeque() {
void MarkCompactCollector::RefillMarkingDeque() { void MarkCompactCollector::RefillMarkingDeque() {
ASSERT(marking_deque_.overflowed()); ASSERT(marking_deque_.overflowed());
SemiSpaceIterator new_it(heap()->new_space()); DiscoverGreyObjectsInNewSpace(heap(), &marking_deque_);
DiscoverGreyObjectsWithIterator(heap(), &marking_deque_, &new_it);
if (marking_deque_.IsFull()) return; if (marking_deque_.IsFull()) return;
DiscoverGreyObjectsInSpace(heap(), DiscoverGreyObjectsInSpace(heap(),
......
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