Chromium Code Reviews| Index: Source/platform/heap/Heap.cpp |
| diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp |
| index 82bf5004634adfe7d318875ee824dccbe5100611..1fd7ec83a49193c54a9ee81dad84907b96cd74ba 100644 |
| --- a/Source/platform/heap/Heap.cpp |
| +++ b/Source/platform/heap/Heap.cpp |
| @@ -543,6 +543,7 @@ void LargeObject::markUnmarkedObjectsDead() |
| void LargeObject::removeFromHeap(ThreadHeap* heap) |
| { |
| + markAsUnswept(); |
|
haraken
2015/01/16 17:29:49
Isn't it guaranteed that the page is already marke
sof
2015/01/16 19:30:17
Removed.
|
| heap->freeLargeObject(this); |
| } |
| @@ -747,11 +748,11 @@ Address ThreadHeap::lazySweepPages(size_t allocationSize, size_t gcInfoIndex) |
| page->sweep(); |
| page->unlink(&m_firstUnsweptPage); |
| page->link(&m_firstPage); |
| + page->markAsSwept(); |
| result = allocateFromFreeList(allocationSize, gcInfoIndex); |
| - if (result) { |
| + if (result) |
| break; |
| - } |
| } |
| } |
| @@ -804,6 +805,7 @@ bool ThreadHeap::lazySweepLargeObjects(size_t allocationSize) |
| largeObject->sweep(); |
| largeObject->unlink(&m_firstUnsweptLargeObject); |
| largeObject->link(&m_firstLargeObject); |
| + largeObject->markAsSwept(); |
| } |
| } |
| @@ -832,6 +834,7 @@ void ThreadHeap::completeSweep() |
| page->sweep(); |
| page->unlink(&m_firstUnsweptPage); |
| page->link(&m_firstPage); |
| + page->markAsSwept(); |
| } |
| } |
| @@ -847,6 +850,7 @@ void ThreadHeap::completeSweep() |
| largeObject->sweep(); |
| largeObject->unlink(&m_firstUnsweptLargeObject); |
| largeObject->link(&m_firstLargeObject); |
| + largeObject->markAsSwept(); |
| } |
| } |
| @@ -1146,6 +1150,8 @@ Address ThreadHeap::allocateLargeObject(size_t size, size_t gcInfoIndex) |
| ASAN_POISON_MEMORY_REGION(largeObject->address() + largeObject->size(), allocationGranularity); |
| largeObject->link(&m_firstLargeObject); |
| + if (threadState()->isSweepingInProgress()) |
| + largeObject->markAsSwept(); |
|
haraken
2015/01/16 17:29:49
It's a bit inconsistent that a page allocated duri
sof
2015/01/16 19:30:17
We can flip defaults that way.
|
| Heap::increaseAllocatedSpace(largeObject->size()); |
| Heap::increaseAllocatedObjectSize(largeObject->size()); |
| @@ -1234,6 +1240,7 @@ BaseHeapPage::BaseHeapPage(PageMemory* storage, ThreadHeap* heap) |
| : m_storage(storage) |
| , m_heap(heap) |
| , m_terminating(false) |
| + , m_swept(false) |
|
haraken
2015/01/16 17:29:49
As commented above, m_swept(true) will make the co
sof
2015/01/16 19:30:17
Done.
|
| { |
| ASSERT(isPageHeaderAddress(reinterpret_cast<Address>(this))); |
| } |
| @@ -1392,6 +1399,8 @@ void ThreadHeap::allocatePage() |
| HeapPage* page = new (pageMemory->writableStart()) HeapPage(pageMemory, this); |
| page->link(&m_firstPage); |
| + if (threadState()->isSweepingInProgress()) |
| + page->markAsSwept(); |
|
haraken
2015/01/16 17:29:49
Ditto. I think we can remove this code.
sof
2015/01/16 19:30:17
Done.
|
| Heap::increaseAllocatedSpace(blinkPageSize); |
| addToFreeList(page->payload(), page->payloadSize()); |
| @@ -1443,14 +1452,17 @@ bool ThreadHeap::isConsistentForSweeping() |
| void ThreadHeap::makeConsistentForSweeping() |
| { |
| - markUnmarkedObjectsDead(); |
| + preparePagesForSweeping(); |
| setAllocationPoint(nullptr, 0); |
| clearFreeLists(); |
| } |
| -void ThreadHeap::markUnmarkedObjectsDead() |
| +void ThreadHeap::preparePagesForSweeping() |
| { |
| ASSERT(isConsistentForSweeping()); |
| + for (HeapPage* page = m_firstPage; page; page = page->next()) |
|
haraken
2015/01/16 17:29:49
You can move this loop to after line 1484.
sof
2015/01/16 19:30:17
It's preferable to have this loop here & over thes
|
| + page->markAsUnswept(); |
| + |
| // If a new GC is requested before this thread got around to sweep, |
| // ie. due to the thread doing a long running operation, we clear |
| // the mark bits and mark any of the dead objects as dead. The latter |
| @@ -1461,6 +1473,7 @@ void ThreadHeap::markUnmarkedObjectsDead() |
| HeapPage* previousPage = nullptr; |
| for (HeapPage* page = m_firstUnsweptPage; page; previousPage = page, page = page->next()) { |
| page->markUnmarkedObjectsDead(); |
| + page->markAsUnswept(); |
|
haraken
2015/01/16 17:29:49
Then you won't need this.
|
| } |
| if (previousPage) { |
| ASSERT(m_firstUnsweptPage); |
| @@ -1470,9 +1483,13 @@ void ThreadHeap::markUnmarkedObjectsDead() |
| } |
| ASSERT(!m_firstUnsweptPage); |
| + for (LargeObject* largeObject = m_firstLargeObject; largeObject; largeObject = largeObject->next()) |
|
haraken
2015/01/16 17:29:49
Ditto.
sof
2015/01/16 19:30:17
See above.
|
| + largeObject->markAsUnswept(); |
| + |
| LargeObject* previousLargeObject = nullptr; |
| for (LargeObject* largeObject = m_firstUnsweptLargeObject; largeObject; previousLargeObject = largeObject, largeObject = largeObject->next()) { |
| largeObject->markUnmarkedObjectsDead(); |
| + largeObject->markAsUnswept(); |
| } |
| if (previousLargeObject) { |
| ASSERT(m_firstUnsweptLargeObject); |
| @@ -1618,6 +1635,7 @@ void HeapPage::markUnmarkedObjectsDead() |
| void HeapPage::removeFromHeap(ThreadHeap* heap) |
| { |
| + markAsUnswept(); |
|
haraken
2015/01/16 17:29:49
I think the page is already marked as unswept. ASS
sof
2015/01/16 19:30:17
Removed.
|
| heap->freePage(this); |
| } |