Chromium Code Reviews| Index: Source/platform/heap/Heap.cpp |
| diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp |
| index cf60075d21be7cff608d6ed77036991566c30bbf..ee78353fee1f2e20aa0e6d4c70db925e4b5823d1 100644 |
| --- a/Source/platform/heap/Heap.cpp |
| +++ b/Source/platform/heap/Heap.cpp |
| @@ -922,6 +922,14 @@ void ThreadHeap::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
| json->setInteger("pageCount", info->pageCount - previousPageCount); |
| } |
| + |
| +void ThreadHeap::incrementMarkedObjectsAge() |
| +{ |
| + for (HeapPage* page = m_firstPage; page; page = page->next()) |
| + page->incrementMarkedObjectsAge(); |
| + for (LargeObject* largeObject = m_firstLargeObject; largeObject; largeObject = largeObject->next()) |
| + largeObject->incrementMarkedObjectsAge(); |
| +} |
| #endif |
| void FreeList::addToFreeList(Address address, size_t size) |
| @@ -1533,6 +1541,22 @@ void ThreadHeap::snapshotFreeList(TracedValue& json) |
| json.pushInteger(bucketStats[i].freeSize); |
| json.endArray(); |
| } |
| + |
| +void ThreadHeap::countMarkedObjects(ClassAgeCountsMap& classAgeCounts) const |
| +{ |
| + for (HeapPage* page = m_firstPage; page; page = page->next()) |
| + page->countMarkedObjects(classAgeCounts); |
| + for (LargeObject* largeObject = m_firstLargeObject; largeObject; largeObject = largeObject->next()) |
| + largeObject->countMarkedObjects(classAgeCounts); |
| +} |
| + |
| +void ThreadHeap::countObjectsToSweep(ClassAgeCountsMap& classAgeCounts) const |
| +{ |
| + for (HeapPage* page = m_firstPage; page; page = page->next()) |
| + page->countObjectsToSweep(classAgeCounts); |
| + for (LargeObject* largeObject = m_firstLargeObject; largeObject; largeObject = largeObject->next()) |
| + largeObject->countObjectsToSweep(classAgeCounts); |
| +} |
| #endif |
| void FreeList::clear() |
| @@ -1802,7 +1826,6 @@ void HeapPage::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
| // Count objects that are live when promoted to the final generation. |
| if (age == maxHeapObjectAge - 1) |
| info->generations[tag][maxHeapObjectAge] += 1; |
| - header->incrementAge(); |
| } else { |
| info->deadCount[tag] += 1; |
| info->deadSize[tag] += header->size(); |
| @@ -1812,6 +1835,40 @@ void HeapPage::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
| } |
| } |
| } |
| + |
| +void HeapPage::incrementMarkedObjectsAge() |
| +{ |
| + HeapObjectHeader* header = nullptr; |
|
haraken
2015/02/06 06:39:20
You can declare HeapObjectHeader* inside the loop.
Yuta Kitamura
2015/02/06 07:45:45
It is used in the third part of the "for" expressi
|
| + for (Address address = payload(); address < payloadEnd(); address += header->size()) { |
| + header = reinterpret_cast<HeapObjectHeader*>(address); |
| + if (header->isMarked()) |
| + header->incrementAge(); |
| + } |
| +} |
| + |
| +void HeapPage::countMarkedObjects(ClassAgeCountsMap& classAgeCounts) |
| +{ |
| + HeapObjectHeader* header = nullptr; |
| + for (Address address = payload(); address < payloadEnd(); address += header->size()) { |
| + header = reinterpret_cast<HeapObjectHeader*>(address); |
| + if (header->isMarked()) { |
| + String className(classOf(header->payload())); |
| + ++(classAgeCounts.add(className, AgeCounts()).storedValue->value.ages[header->age()]); |
| + } |
| + } |
| +} |
| + |
| +void HeapPage::countObjectsToSweep(ClassAgeCountsMap& classAgeCounts) |
| +{ |
| + HeapObjectHeader* header = nullptr; |
| + for (Address address = payload(); address < payloadEnd(); address += header->size()) { |
| + header = reinterpret_cast<HeapObjectHeader*>(address); |
| + if (!header->isFree() && !header->isMarked()) { |
| + String className(classOf(header->payload())); |
| + ++(classAgeCounts.add(className, AgeCounts()).storedValue->value.ages[header->age()]); |
| + } |
| + } |
| +} |
| #endif |
| size_t LargeObject::objectPayloadSizeForTesting() |
| @@ -1840,7 +1897,6 @@ void LargeObject::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
| // Count objects that are live when promoted to the final generation. |
| if (age == maxHeapObjectAge - 1) |
| info->generations[tag][maxHeapObjectAge] += 1; |
| - header->incrementAge(); |
| } else { |
| info->deadCount[tag] += 1; |
| info->deadSize[tag] += header->size(); |
| @@ -1855,6 +1911,31 @@ void LargeObject::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
| json->setInteger("isMarked", header->isMarked()); |
| } |
| } |
| + |
| +void LargeObject::incrementMarkedObjectsAge() |
| +{ |
| + HeapObjectHeader* header = heapObjectHeader(); |
| + if (header->isMarked()) |
| + header->incrementAge(); |
| +} |
| + |
| +void LargeObject::countMarkedObjects(ClassAgeCountsMap& classAgeCounts) |
| +{ |
| + HeapObjectHeader* header = heapObjectHeader(); |
| + if (header->isMarked()) { |
| + String className(classOf(header->payload())); |
| + ++(classAgeCounts.add(className, AgeCounts()).storedValue->value.ages[header->age()]); |
| + } |
| +} |
| + |
| +void LargeObject::countObjectsToSweep(ClassAgeCountsMap& classAgeCounts) |
| +{ |
| + HeapObjectHeader* header = heapObjectHeader(); |
| + if (!header->isFree() && !header->isMarked()) { |
| + String className(classOf(header->payload())); |
| + ++(classAgeCounts.add(className, AgeCounts()).storedValue->value.ages[header->age()]); |
| + } |
| +} |
| #endif |
| void HeapDoesNotContainCache::flush() |