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

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

Issue 744103003: Oilpan: Implement bitmap marking Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « Source/platform/heap/Heap.h ('k') | Source/platform/heap/ThreadState.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/heap/Heap.cpp
diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp
index d0471e8e65a72f20f77f826261b864025b3970de..48bf7051a7483c3ac17a5ce5ea83858c03f4602f 100644
--- a/Source/platform/heap/Heap.cpp
+++ b/Source/platform/heap/Heap.cpp
@@ -456,18 +456,10 @@ private:
bool m_parkedAllThreads; // False if we fail to park all threads
};
-NO_SANITIZE_ADDRESS inline
-bool HeapObjectHeader::isMarked() const
-{
- checkHeader();
- return m_size & markBitMask;
-}
-
-NO_SANITIZE_ADDRESS inline
-void HeapObjectHeader::unmark()
+inline bool HeapObjectHeader::isMarked() const
{
checkHeader();
- m_size &= ~markBitMask;
+ return pageHeaderFromObject(this)->objectIsMarked(reinterpret_cast<Address>(const_cast<HeapObjectHeader*>(this)));
}
NO_SANITIZE_ADDRESS inline
@@ -539,12 +531,6 @@ void FinalizedHeapObjectHeader::finalize()
}
template<typename Header>
-void LargeHeapObject<Header>::unmark()
-{
- return heapObjectHeader()->unmark();
-}
-
-template<typename Header>
bool LargeHeapObject<Header>::isMarked()
{
return heapObjectHeader()->isMarked();
@@ -1172,6 +1158,7 @@ OrphanedPagePool::~OrphanedPagePool()
void OrphanedPagePool::addOrphanedPage(int index, BaseHeapPage* page)
{
+ page->clearObjectMarkBitMap();
page->markOrphaned();
PoolEntry* entry = new PoolEntry(page, m_pool[index]);
m_pool[index] = entry;
@@ -1414,7 +1401,6 @@ void ThreadHeap<Header>::sweepLargePages()
for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current;) {
if (current->isMarked()) {
Heap::increaseMarkedObjectSize(current->size());
- current->unmark();
previousNext = &current->m_next;
current = current->next();
} else {
@@ -1496,20 +1482,31 @@ void ThreadHeap<Header>::makeConsistentForSweeping()
}
template<typename Header>
-void ThreadHeap<Header>::clearLiveAndMarkDead()
+void ThreadHeap<Header>::makeUnmarkedObjectsDead()
{
ASSERT(isConsistentForSweeping());
- for (HeapPage<Header>* page = m_firstPage; page; page = page->next())
- page->clearLiveAndMarkDead();
+ for (HeapPage<Header>* page = m_firstPage; page; page = page->next()) {
+ page->makeUnmarkedObjectsDead();
+ }
for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current; current = current->next()) {
- if (current->isMarked())
- current->unmark();
- else
+ if (!current->isMarked())
current->setDeadMark();
}
}
template<typename Header>
+void ThreadHeap<Header>::clearObjectMarkBitMaps()
+{
+ ASSERT(isConsistentForSweeping());
+ for (HeapPage<Header>* page = m_firstPage; page; page = page->next()) {
+ page->clearObjectMarkBitMap();
+ }
+ for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current; current = current->next()) {
+ current->clearObjectMarkBitMap();
+ }
+}
+
+template<typename Header>
void ThreadHeap<Header>::clearFreeLists()
{
m_promptlyFreedCount = 0;
@@ -1549,6 +1546,12 @@ HeapPage<Header>::HeapPage(PageMemory* storage, ThreadHeap<Header>* heap, const
}
template<typename Header>
+void HeapPage<Header>::clearObjectMarkBitMap()
+{
+ memset(&m_objectMarkBitMap, 0, reservedForObjectMarkBitMap);
+}
+
+template<typename Header>
void HeapPage<Header>::link(HeapPage** prevNext)
{
m_next = *prevNext;
@@ -1634,7 +1637,6 @@ void HeapPage<Header>::sweep(ThreadHeap<Header>* heap)
if (startOfGap != headerAddress)
heap->addToFreeList(startOfGap, headerAddress - startOfGap);
- header->unmark();
headerAddress += header->size();
Heap::increaseMarkedObjectSize(header->size());
startOfGap = headerAddress;
@@ -1644,7 +1646,7 @@ void HeapPage<Header>::sweep(ThreadHeap<Header>* heap)
}
template<typename Header>
-void HeapPage<Header>::clearLiveAndMarkDead()
+void HeapPage<Header>::makeUnmarkedObjectsDead()
{
for (Address headerAddress = payload(); headerAddress < end();) {
Header* header = reinterpret_cast<Header*>(headerAddress);
@@ -1655,9 +1657,7 @@ void HeapPage<Header>::clearLiveAndMarkDead()
headerAddress += header->size();
continue;
}
- if (header->isMarked())
- header->unmark();
- else
+ if (!header->isMarked())
header->setDeadMark();
headerAddress += header->size();
}
« no previous file with comments | « Source/platform/heap/Heap.h ('k') | Source/platform/heap/ThreadState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698