Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(144)

Unified Diff: Source/platform/heap/Heap.cpp

Issue 903033003: Oilpan: Implement mark/sweep stats collection for free list profiler. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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()

Powered by Google App Engine
This is Rietveld 408576698