Commit a4bcd81a authored by hpayer's avatar hpayer Committed by Commit bot

Large objects do not require special handling anymore when they are freed.

Invalid slots in large objects can only occur when large objects became dead. These slots are filtered out already after marking.

BUG=

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

Cr-Commit-Position: refs/heads/master@{#30273}
parent 05e84344
......@@ -6670,35 +6670,6 @@ void Heap::FreeQueuedChunks() {
for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) {
next = chunk->next_chunk();
chunk->SetFlag(MemoryChunk::ABOUT_TO_BE_FREED);
if (chunk->owner()->identity() == LO_SPACE) {
// StoreBuffer::Filter relies on MemoryChunk::FromAnyPointerAddress.
// If FromAnyPointerAddress encounters a slot that belongs to a large
// chunk queued for deletion it will fail to find the chunk because
// it try to perform a search in the list of pages owned by of the large
// object space and queued chunks were detached from that list.
// To work around this we split large chunk into normal kPageSize aligned
// pieces and initialize size, owner and flags field of every piece.
// If FromAnyPointerAddress encounters a slot that belongs to one of
// these smaller pieces it will treat it as a slot on a normal Page.
Address chunk_end = chunk->address() + chunk->size();
MemoryChunk* inner =
MemoryChunk::FromAddress(chunk->address() + Page::kPageSize);
MemoryChunk* inner_last = MemoryChunk::FromAddress(chunk_end - 1);
while (inner <= inner_last) {
// Size of a large chunk is always a multiple of
// OS::AllocateAlignment() so there is always
// enough space for a fake MemoryChunk header.
Address area_end = Min(inner->address() + Page::kPageSize, chunk_end);
// Guard against overflow.
if (area_end < inner->address()) area_end = chunk_end;
inner->SetArea(inner->address(), area_end);
inner->set_size(Page::kPageSize);
inner->set_owner(lo_space());
inner->SetFlag(MemoryChunk::ABOUT_TO_BE_FREED);
inner = MemoryChunk::FromAddress(inner->address() + Page::kPageSize);
}
}
}
isolate_->heap()->store_buffer()->Compact();
isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED);
......
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