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

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

Issue 1157933002: Oilpan: introduce eager finalization. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: round of improvements Created 5 years, 7 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 85a75d2994ce8d6e081e178d6246bdc652039355..5e9ea0c08c232c6545207e5ac835c95df603f051 100644
--- a/Source/platform/heap/Heap.cpp
+++ b/Source/platform/heap/Heap.cpp
@@ -346,8 +346,27 @@ 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();
+ for (BasePage* page = m_firstUnsweptPage; page; page = page->next())
+ page->poisonObjects(UnmarkedOnly, SetPoison);
+}
+
+void BaseHeap::poisonHeap(Poisoning poisoning)
haraken 2015/06/01 08:42:52 I'd call this function poisonUnmarkedAndMarkedObje
sof 2015/06/01 14:51:36 Addressed (see below.)
+{
+ // TODO(sof): support poisoning of all heaps.
+ ASSERT(heapIndex() == EagerSweepHeapIndex);
+ // This method is called with SetPoison just before starting sweeping
+ // of (eager) heaps. Hence, all objects will be in m_firstUnsweptPage
+ // before start.
+ if (poisoning == SetPoison) {
+ ASSERT(!m_firstPage);
+ for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) {
+ page->poisonObjects(UnmarkedOrMarked, SetPoison);
+ }
+ return;
+ }
+ ASSERT(!m_firstUnsweptPage);
+ for (BasePage* page = m_firstPage; page; page = page->next()) {
+ page->poisonObjects(UnmarkedOnly, ClearPoison);
haraken 2015/06/01 08:42:52 Nit: If we call the function poisonUnmarkedAndMark
sof 2015/06/01 14:51:36 There wouldn't, but that observation made me reali
}
}
#endif
@@ -782,6 +801,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);
haraken 2015/06/01 08:42:52 I'd use RELEASE_ASSERT, since if we hit this, we'l
sof 2015/06/01 14:51:36 switched; to the extent there's overhead, this isn
LargeObjectHeap* largeObjectHeap = static_cast<LargeObjectHeap*>(threadState()->heap(LargeObjectHeapIndex));
Address largeObject = largeObjectHeap->allocateLargeObjectPage(allocationSize, gcInfoIndex);
ASAN_MARK_LARGE_VECTOR_CONTAINER(this, largeObject);
@@ -1152,7 +1173,6 @@ void NormalPage::sweep()
headerAddress += size;
continue;
}
-
if (startOfGap != headerAddress)
heapForNormalPage()->addToFreeList(startOfGap, headerAddress - startOfGap);
header->unmark();
@@ -1193,7 +1213,7 @@ void NormalPage::makeConsistentForGC()
}
#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);
@@ -1205,8 +1225,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();
}
@@ -1482,11 +1505,15 @@ void LargeObjectPage::makeConsistentForGC()
}
#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 == SetPoison)
+ ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize());
+ else
+ ASAN_UNPOISON_MEMORY_REGION(header->payload(), header->payloadSize());
+ }
}
#endif

Powered by Google App Engine
This is Rietveld 408576698