Chromium Code Reviews| Index: Source/platform/heap/Heap.cpp |
| diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp |
| index d1f421585fb0f096e10c0b5788c4f529fdfcdc4b..9d4ebb3a7316054ec38195e8619df721168de7cd 100644 |
| --- a/Source/platform/heap/Heap.cpp |
| +++ b/Source/platform/heap/Heap.cpp |
| @@ -334,7 +334,24 @@ void BaseHeap::poisonUnmarkedObjects() |
| // This method is called just before starting sweeping. |
| // Thus all dead objects are in the list of m_firstUnsweptPage. |
| for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { |
| - page->poisonUnmarkedObjects(); |
| + page->poisonObjects(BasePage::UnmarkedOnly, BasePage::SetPoison); |
| + } |
| +} |
| + |
| +void BaseHeap::poisonHeap(bool setPoison) |
|
haraken
2015/05/28 12:30:04
poisonHeap => poisonEagerHeap
I'd use SetPoison/C
sof
2015/05/29 21:25:07
Moved enums around to make that possible.
Keeping
|
| +{ |
| + ASSERT(heapIndex() == EagerSweepHeapIndex); |
| + // This method is called just before starting sweeping |
| + // of eager heaps. Hence, all objects will be in |
| + // m_firstUnsweptPage before start. |
| + if (setPoison) { |
| + for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { |
|
haraken
2015/05/28 12:30:04
Add ASSERT(!m_firstPage).
sof
2015/05/29 21:25:07
Done.
|
| + page->poisonObjects(BasePage::UnmarkedOrMarked, BasePage::SetPoison); |
|
haraken
2015/05/28 12:30:04
Why do we need to poison marked objects? I'm ok wi
sof
2015/05/29 21:25:07
You're not allowed to touch other eagerly finalize
|
| + } |
| + return; |
| + } |
| + for (BasePage* page = m_firstPage; page; page = page->next()) { |
| + page->poisonObjects(BasePage::UnmarkedOnly, BasePage::ClearPoison); |
|
haraken
2015/05/28 12:30:04
Who unpoisons the marked objects that have been po
sof
2015/05/29 21:25:07
This very loop when poisonHeap() is called on the
|
| } |
| } |
| #endif |
| @@ -769,6 +786,8 @@ Address NormalPageHeap::outOfLineAllocate(size_t allocationSize, size_t gcInfoIn |
| // 1. If this allocation is big enough, allocate a large object. |
| if (allocationSize >= largeObjectSizeThreshold) { |
| + // TODO(sof): support eagerly finalized large objects, if ever needed. |
| + ASSERT(heapIndex() != EagerSweepHeapIndex); |
| LargeObjectHeap* largeObjectHeap = static_cast<LargeObjectHeap*>(threadState()->heap(LargeObjectHeapIndex)); |
| Address largeObject = largeObjectHeap->allocateLargeObjectPage(allocationSize, gcInfoIndex); |
| ASAN_MARK_LARGE_VECTOR_CONTAINER(this, largeObject); |
| @@ -1139,7 +1158,6 @@ void NormalPage::sweep() |
| headerAddress += size; |
| continue; |
| } |
| - |
| if (startOfGap != headerAddress) |
| heapForNormalPage()->addToFreeList(startOfGap, headerAddress - startOfGap); |
| header->unmark(); |
| @@ -1180,7 +1198,7 @@ void NormalPage::markUnmarkedObjectsDead() |
| } |
| #if defined(ADDRESS_SANITIZER) |
| -void NormalPage::poisonUnmarkedObjects() |
| +void NormalPage::poisonObjects(ObjectsToPoison objectsToPoison, Poisoning poisoning) |
| { |
| for (Address headerAddress = payload(); headerAddress < payloadEnd();) { |
| HeapObjectHeader* header = reinterpret_cast<HeapObjectHeader*>(headerAddress); |
| @@ -1192,8 +1210,11 @@ void NormalPage::poisonUnmarkedObjects() |
| continue; |
| } |
| header->checkHeader(); |
| - if (!header->isMarked()) { |
| - ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize()); |
| + if (objectsToPoison == UnmarkedOrMarked || !header->isMarked()) { |
| + if (poisoning == SetPoison) |
| + ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize()); |
| + else |
| + ASAN_UNPOISON_MEMORY_REGION(header->payload(), header->payloadSize()); |
| } |
| headerAddress += header->size(); |
| } |
| @@ -1469,11 +1490,15 @@ void LargeObjectPage::markUnmarkedObjectsDead() |
| } |
| #if defined(ADDRESS_SANITIZER) |
| -void LargeObjectPage::poisonUnmarkedObjects() |
| +void LargeObjectPage::poisonObjects(ObjectsToPoison objectsToPoison, Poisoning poisoning) |
| { |
| HeapObjectHeader* header = heapObjectHeader(); |
| - if (!header->isMarked()) |
| - ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize()); |
| + if (objectsToPoison == UnmarkedOrMarked || !header->isMarked()) { |
| + if (poisoning == BasePage::SetPoison) |
| + ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize()); |
| + else |
| + ASAN_UNPOISON_MEMORY_REGION(header->payload(), header->payloadSize()); |
| + } |
| } |
| #endif |