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

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

Issue 850063002: Do not fire timers for finalizing objects. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Reset sweep status on pages before sweeping instead Created 5 years, 11 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
« Source/platform/heap/Heap.h ('K') | « Source/platform/heap/Heap.h ('k') | no next file » | 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 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);
}
« Source/platform/heap/Heap.h ('K') | « Source/platform/heap/Heap.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698