[heap] Black areas are created for both linear and free list allocations.

BUG=

Review-Url: https://codereview.chromium.org/2562383002
Cr-Commit-Position: refs/heads/master@{#41646}
This commit is contained in:
hpayer 2016-12-12 06:45:38 -08:00 committed by Commit bot
parent 64d9352a54
commit fc2503d137
3 changed files with 24 additions and 13 deletions

View File

@ -430,11 +430,10 @@ AllocationResult PagedSpace::AllocateRawUnaligned(
if (object == NULL) {
object = SlowAllocateRaw(size_in_bytes);
}
if (object != NULL) {
if (heap()->incremental_marking()->black_allocation()) {
Marking::MarkBlack(ObjectMarking::MarkBitFrom(object));
MemoryChunk::IncrementLiveBytes(object, size_in_bytes);
}
if (object != NULL && heap()->incremental_marking()->black_allocation()) {
Address start = object->address();
Address end = object->address() + size_in_bytes;
Page::FromAllocationAreaAddress(start)->CreateBlackArea(start, end);
}
}
@ -472,6 +471,11 @@ AllocationResult PagedSpace::AllocateRawAligned(int size_in_bytes,
object = free_list_.Allocate(allocation_size);
if (object == NULL) {
object = SlowAllocateRaw(allocation_size);
if (object != NULL && heap()->incremental_marking()->black_allocation()) {
Address start = object->address();
Address end = object->address() + size_in_bytes;
Page::FromAllocationAreaAddress(start)->CreateBlackArea(start, end);
}
}
if (object != NULL && filler_size != 0) {
object = heap()->AlignWithFiller(object, size_in_bytes, allocation_size,

View File

@ -833,6 +833,16 @@ size_t Page::ShrinkToHighWaterMark() {
return unused;
}
void Page::CreateBlackArea(Address start, Address end) {
DCHECK(heap()->incremental_marking()->black_allocation());
DCHECK_EQ(Page::FromAddress(start), this);
DCHECK_NE(start, end);
DCHECK_EQ(Page::FromAddress(end - 1), this);
markbits()->SetRange(AddressToMarkbitIndex(start),
AddressToMarkbitIndex(end));
IncrementLiveBytes(static_cast<int>(end - start));
}
void MemoryAllocator::PartialFreeMemory(MemoryChunk* chunk,
Address start_free) {
// We do not allow partial shrink for code.
@ -1342,10 +1352,7 @@ void PagedSpace::SetAllocationInfo(Address top, Address limit) {
SetTopAndLimit(top, limit);
if (top != nullptr && top != limit &&
heap()->incremental_marking()->black_allocation()) {
Page* page = Page::FromAllocationAreaAddress(top);
page->markbits()->SetRange(page->AddressToMarkbitIndex(top),
page->AddressToMarkbitIndex(limit));
page->IncrementLiveBytes(static_cast<int>(limit - top));
Page::FromAllocationAreaAddress(top)->CreateBlackArea(top, limit);
}
}
@ -1354,10 +1361,8 @@ void PagedSpace::MarkAllocationInfoBlack() {
Address current_top = top();
Address current_limit = limit();
if (current_top != nullptr && current_top != current_limit) {
Page* page = Page::FromAllocationAreaAddress(current_top);
page->markbits()->SetRange(page->AddressToMarkbitIndex(current_top),
page->AddressToMarkbitIndex(current_limit));
page->IncrementLiveBytes(static_cast<int>(current_limit - current_top));
Page::FromAllocationAreaAddress(current_top)
->CreateBlackArea(current_top, current_limit);
}
}

View File

@ -769,6 +769,8 @@ class Page : public MemoryChunk {
size_t ShrinkToHighWaterMark();
void CreateBlackArea(Address start, Address end);
#ifdef DEBUG
void Print();
#endif // DEBUG