Chromium Code Reviews| Index: src/mark-compact.cc |
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
| index 9d83d90fbfad8259f724c2baa8c1e2bd41ddb4ce..7c59c0471e4b81c74169ad75beff6a50776168e1 100644 |
| --- a/src/mark-compact.cc |
| +++ b/src/mark-compact.cc |
| @@ -107,14 +107,14 @@ static void VerifyMarking(NewSpace* space) { |
| Address end = space->top(); |
| NewSpacePageIterator it(space->bottom(), end); |
| // The bottom position is at the start of its page. Allows us to use |
| - // page->body() as start of range on all pages. |
| + // page->area_start() as start of range on all pages. |
| ASSERT_EQ(space->bottom(), |
| - NewSpacePage::FromAddress(space->bottom())->body()); |
| + NewSpacePage::FromAddress(space->bottom())->area_start()); |
| while (it.has_next()) { |
| NewSpacePage* page = it.next(); |
| - Address limit = it.has_next() ? page->body_limit() : end; |
| + Address limit = it.has_next() ? page->area_end() : end; |
| ASSERT(limit == end || !page->Contains(end)); |
| - VerifyMarking(page->body(), limit); |
| + VerifyMarking(page->area_start(), limit); |
| } |
| } |
| @@ -124,7 +124,7 @@ static void VerifyMarking(PagedSpace* space) { |
| while (it.has_next()) { |
| Page* p = it.next(); |
| - VerifyMarking(p->ObjectAreaStart(), p->ObjectAreaEnd()); |
| + VerifyMarking(p->area_start(), p->area_end()); |
| } |
| } |
| @@ -187,8 +187,8 @@ static void VerifyEvacuation(NewSpace* space) { |
| while (it.has_next()) { |
| NewSpacePage* page = it.next(); |
| - Address current = page->body(); |
| - Address limit = it.has_next() ? page->body_limit() : space->top(); |
| + Address current = page->area_start(); |
| + Address limit = it.has_next() ? page->area_end() : space->top(); |
| ASSERT(limit == space->top() || !page->Contains(space->top())); |
| while (current < limit) { |
| HeapObject* object = HeapObject::FromAddress(current); |
| @@ -205,7 +205,7 @@ static void VerifyEvacuation(PagedSpace* space) { |
| while (it.has_next()) { |
| Page* p = it.next(); |
| if (p->IsEvacuationCandidate()) continue; |
| - VerifyEvacuation(p->ObjectAreaStart(), p->ObjectAreaEnd()); |
| + VerifyEvacuation(p->area_start(), p->area_end()); |
| } |
| } |
| @@ -232,7 +232,7 @@ void MarkCompactCollector::AddEvacuationCandidate(Page* p) { |
| static void TraceFragmentation(PagedSpace* space) { |
| int number_of_pages = space->CountTotalPages(); |
| - intptr_t reserved = (number_of_pages * Page::kObjectAreaSize); |
| + intptr_t reserved = (number_of_pages * space->AreaSize()); |
| intptr_t free = reserved - space->SizeOfObjects(); |
| PrintF("[%s]: %d pages, %d (%.1f%%) free\n", |
| AllocationSpaceName(space->identity()), |
| @@ -453,13 +453,14 @@ static int FreeListFragmentation(PagedSpace* space, Page* p) { |
| intptr_t ratio; |
| intptr_t ratio_threshold; |
| + intptr_t area_size = space->AreaSize(); |
| if (space->identity() == CODE_SPACE) { |
| ratio = (sizes.medium_size_ * 10 + sizes.large_size_ * 2) * 100 / |
| - Page::kObjectAreaSize; |
| + area_size; |
| ratio_threshold = 10; |
| } else { |
| ratio = (sizes.small_size_ * 5 + sizes.medium_size_) * 100 / |
| - Page::kObjectAreaSize; |
| + area_size; |
| ratio_threshold = 15; |
| } |
| @@ -469,20 +470,20 @@ static int FreeListFragmentation(PagedSpace* space, Page* p) { |
| AllocationSpaceName(space->identity()), |
| static_cast<int>(sizes.small_size_), |
| static_cast<double>(sizes.small_size_ * 100) / |
| - Page::kObjectAreaSize, |
| + area_size, |
| static_cast<int>(sizes.medium_size_), |
| static_cast<double>(sizes.medium_size_ * 100) / |
| - Page::kObjectAreaSize, |
| + area_size, |
| static_cast<int>(sizes.large_size_), |
| static_cast<double>(sizes.large_size_ * 100) / |
| - Page::kObjectAreaSize, |
| + area_size, |
| static_cast<int>(sizes.huge_size_), |
| static_cast<double>(sizes.huge_size_ * 100) / |
| - Page::kObjectAreaSize, |
| + area_size, |
| (ratio > ratio_threshold) ? "[fragmented]" : ""); |
| } |
| - if (FLAG_always_compact && sizes.Total() != Page::kObjectAreaSize) { |
| + if (FLAG_always_compact && sizes.Total() != area_size) { |
| return 1; |
| } |
| @@ -528,11 +529,11 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) { |
| CompactionMode mode = COMPACT_FREE_LISTS; |
| - intptr_t reserved = number_of_pages * Page::kObjectAreaSize; |
| + intptr_t reserved = number_of_pages * space->AreaSize(); |
| intptr_t over_reserved = reserved - space->SizeOfObjects(); |
| static const intptr_t kFreenessThreshold = 50; |
| - if (over_reserved >= 2 * Page::kObjectAreaSize && |
| + if (over_reserved >= 2 * space->AreaSize() && |
| reduce_memory_footprint_) { |
| mode = REDUCE_MEMORY_FOOTPRINT; |
| @@ -575,18 +576,17 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) { |
| intptr_t free_bytes = 0; |
| if (!p->WasSwept()) { |
| - free_bytes = (Page::kObjectAreaSize - p->LiveBytes()); |
| + free_bytes = (p->area_size() - p->LiveBytes()); |
| } else { |
| FreeList::SizeStats sizes; |
| space->CountFreeListItems(p, &sizes); |
| free_bytes = sizes.Total(); |
| } |
| - int free_pct = static_cast<int>(free_bytes * 100 / Page::kObjectAreaSize); |
| + int free_pct = static_cast<int>(free_bytes * 100) / p->area_size(); |
| if (free_pct >= kFreenessThreshold) { |
| - estimated_release += Page::kObjectAreaSize + |
| - (Page::kObjectAreaSize - free_bytes); |
| + estimated_release += 2 * p->area_size() - free_bytes; |
| fragmentation = free_pct; |
| } else { |
| fragmentation = 0; |
| @@ -597,7 +597,7 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) { |
| reinterpret_cast<void*>(p), |
| AllocationSpaceName(space->identity()), |
| static_cast<int>(free_bytes), |
| - static_cast<double>(free_bytes * 100) / Page::kObjectAreaSize, |
| + static_cast<double>(free_bytes * 100) / p->area_size(), |
| (fragmentation > 0) ? "[fragmented]" : ""); |
| } |
| } else { |
| @@ -1977,12 +1977,15 @@ static void DiscoverGreyObjectsOnPage(MarkingDeque* marking_deque, Page* p) { |
| int last_cell_index = |
| Bitmap::IndexToCell( |
| Bitmap::CellAlignIndex( |
| - p->AddressToMarkbitIndex(p->ObjectAreaEnd()))); |
| + p->AddressToMarkbitIndex(p->area_end()))); |
| + |
| + Address cell_base = p->area_start(); |
| + int cell_index = Bitmap::IndexToCell( |
| + Bitmap::CellAlignIndex( |
| + p->AddressToMarkbitIndex(cell_base))); |
| - int cell_index = Page::kFirstUsedCell; |
| - Address cell_base = p->ObjectAreaStart(); |
| - for (cell_index = Page::kFirstUsedCell; |
| + for (; |
| cell_index < last_cell_index; |
| cell_index++, cell_base += 32 * kPointerSize) { |
| ASSERT((unsigned)cell_index == |
| @@ -2786,7 +2789,7 @@ bool MarkCompactCollector::TryPromoteObject(HeapObject* object, |
| int object_size) { |
| Object* result; |
| - if (object_size > heap()->MaxObjectSizeInPagedSpace()) { |
| + if (object_size > Page::kMaxNonCodeHeapObjectSize) { |
| MaybeObject* maybe_result = |
| heap()->lo_space()->AllocateRaw(object_size, NOT_EXECUTABLE); |
| if (maybe_result->ToObject(&result)) { |
| @@ -2904,13 +2907,16 @@ void MarkCompactCollector::EvacuateLiveObjectsFromPage(Page* p) { |
| int last_cell_index = |
| Bitmap::IndexToCell( |
| Bitmap::CellAlignIndex( |
| - p->AddressToMarkbitIndex(p->ObjectAreaEnd()))); |
| + p->AddressToMarkbitIndex(p->area_end()))); |
| + |
| + Address cell_base = p->area_start(); |
| + int cell_index = Bitmap::IndexToCell( |
| + Bitmap::CellAlignIndex( |
| + p->AddressToMarkbitIndex(cell_base))); |
| - int cell_index = Page::kFirstUsedCell; |
| - Address cell_base = p->ObjectAreaStart(); |
| int offsets[16]; |
| - for (cell_index = Page::kFirstUsedCell; |
| + for (; |
| cell_index < last_cell_index; |
| cell_index++, cell_base += 32 * kPointerSize) { |
| ASSERT((unsigned)cell_index == |
| @@ -3065,12 +3071,16 @@ static void SweepPrecisely(PagedSpace* space, |
| int last_cell_index = |
| Bitmap::IndexToCell( |
| Bitmap::CellAlignIndex( |
| - p->AddressToMarkbitIndex(p->ObjectAreaEnd()))); |
| + p->AddressToMarkbitIndex(p->area_end()))); |
| + |
| + Address free_start = p->area_start(); |
| + int cell_index = |
|
Erik Corry
2012/02/23 12:00:40
I think it is clearer to move this down to immedia
|
| + Bitmap::IndexToCell( |
| + Bitmap::CellAlignIndex( |
| + p->AddressToMarkbitIndex(free_start))); |
| - int cell_index = Page::kFirstUsedCell; |
| - Address free_start = p->ObjectAreaStart(); |
| ASSERT(reinterpret_cast<intptr_t>(free_start) % (32 * kPointerSize) == 0); |
| - Address object_address = p->ObjectAreaStart(); |
| + Address object_address = free_start; |
| int offsets[16]; |
| SkipList* skip_list = p->skip_list(); |
| @@ -3079,7 +3089,7 @@ static void SweepPrecisely(PagedSpace* space, |
| skip_list->Clear(); |
| } |
| - for (cell_index = Page::kFirstUsedCell; |
| + for (; |
| cell_index < last_cell_index; |
| cell_index++, object_address += 32 * kPointerSize) { |
| ASSERT((unsigned)cell_index == |
| @@ -3116,8 +3126,8 @@ static void SweepPrecisely(PagedSpace* space, |
| // Clear marking bits for current cell. |
| cells[cell_index] = 0; |
| } |
| - if (free_start != p->ObjectAreaEnd()) { |
| - space->Free(free_start, static_cast<int>(p->ObjectAreaEnd() - free_start)); |
| + if (free_start != p->area_end()) { |
| + space->Free(free_start, static_cast<int>(p->area_end() - free_start)); |
| } |
| p->ResetLiveBytes(); |
| } |
| @@ -3412,7 +3422,7 @@ void MarkCompactCollector::EvacuateNewSpaceAndCandidates() { |
| Page* p = evacuation_candidates_[i]; |
| if (!p->IsEvacuationCandidate()) continue; |
| PagedSpace* space = static_cast<PagedSpace*>(p->owner()); |
| - space->Free(p->ObjectAreaStart(), Page::kObjectAreaSize); |
| + space->Free(p->area_start(), p->area_size()); |
| p->set_scan_on_scavenge(false); |
| slots_buffer_allocator_.DeallocateChain(p->slots_buffer_address()); |
| p->ClearEvacuationCandidate(); |
| @@ -3715,23 +3725,27 @@ intptr_t MarkCompactCollector::SweepConservatively(PagedSpace* space, Page* p) { |
| int last_cell_index = |
| Bitmap::IndexToCell( |
| Bitmap::CellAlignIndex( |
| - p->AddressToMarkbitIndex(p->ObjectAreaEnd()))); |
| + p->AddressToMarkbitIndex(p->area_end()))); |
| + |
| + int cell_index = |
| + Bitmap::IndexToCell( |
| + Bitmap::CellAlignIndex( |
| + p->AddressToMarkbitIndex(p->area_start()))); |
| - int cell_index = Page::kFirstUsedCell; |
| intptr_t freed_bytes = 0; |
| // This is the start of the 32 word block that we are currently looking at. |
| - Address block_address = p->ObjectAreaStart(); |
| + Address block_address = p->area_start(); |
| // Skip over all the dead objects at the start of the page and mark them free. |
| - for (cell_index = Page::kFirstUsedCell; |
| + for (; |
| cell_index < last_cell_index; |
| cell_index++, block_address += 32 * kPointerSize) { |
| if (cells[cell_index] != 0) break; |
| } |
| - size_t size = block_address - p->ObjectAreaStart(); |
| + size_t size = block_address - p->area_start(); |
| if (cell_index == last_cell_index) { |
| - freed_bytes += static_cast<int>(space->Free(p->ObjectAreaStart(), |
| + freed_bytes += static_cast<int>(space->Free(p->area_start(), |
| static_cast<int>(size))); |
| ASSERT_EQ(0, p->LiveBytes()); |
| return freed_bytes; |
| @@ -3740,8 +3754,8 @@ intptr_t MarkCompactCollector::SweepConservatively(PagedSpace* space, Page* p) { |
| // first live object. |
| Address free_end = StartOfLiveObject(block_address, cells[cell_index]); |
| // Free the first free space. |
| - size = free_end - p->ObjectAreaStart(); |
| - freed_bytes += space->Free(p->ObjectAreaStart(), |
| + size = free_end - p->area_start(); |
| + freed_bytes += space->Free(p->area_start(), |
| static_cast<int>(size)); |
| // The start of the current free area is represented in undigested form by |
| // the address of the last 32-word section that contained a live object and |