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

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

Issue 271703002: Simplify and speed up address-to-page cache for conservative stack scanning. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: There were some missing cache flushes. Strengthened asserts Created 6 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
« Source/platform/heap/Heap.cpp ('K') | « Source/platform/heap/ThreadState.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/ThreadState.cpp
diff --git a/Source/platform/heap/ThreadState.cpp b/Source/platform/heap/ThreadState.cpp
index 25b50dd9a0fe927b6899bf912eb54c4ccfae8507..09c3a11b12b7fa890779236d5e9677fd38c9b539 100644
--- a/Source/platform/heap/ThreadState.cpp
+++ b/Source/platform/heap/ThreadState.cpp
@@ -469,14 +469,18 @@ bool ThreadState::checkAndMarkPointer(Visitor* visitor, Address address)
if (m_isCleaningUp)
return false;
+ // This checks for normal pages and for large objects which span the extent
+ // of several normal pages.
BaseHeapPage* page = heapPageFromAddress(address);
- if (page)
- return page->checkAndMarkPointer(visitor, address);
- // Not in heap pages, check large objects
- for (int i = 0; i < NumberOfHeaps; i++) {
- if (m_heaps[i]->checkAndMarkLargeHeapObject(visitor, address))
- return true;
+ if (page) {
+ page->checkAndMarkPointer(visitor, address);
+ // Whether or not the pointer was within an object it was certainly
+ // within a page that is part of the heap, so we don't want to ask the
+ // other other heaps or put this address in the
wibling-chromium 2014/05/09 10:25:20 other other -> other
+ // HeapDoesNotContainCache.
+ return true;
}
+
return false;
}
@@ -487,12 +491,6 @@ const GCInfo* ThreadState::findGCInfo(Address address)
if (page) {
return page->findGCInfo(address);
}
-
- // Not in heap pages, check large objects
- for (int i = 0; i < NumberOfHeaps; i++) {
- if (const GCInfo* info = m_heaps[i]->findGCInfoOfLargeHeapObject(address))
- return info;
- }
return 0;
}
#endif
@@ -654,37 +652,28 @@ void ThreadState::prepareForGC()
BaseHeapPage* ThreadState::heapPageFromAddress(Address address)
{
- BaseHeapPage* page;
- bool found = heapContainsCache()->lookup(address, &page);
- if (found)
- return page;
-
- for (int i = 0; i < NumberOfHeaps; i++) {
- page = m_heaps[i]->heapPageFromAddress(address);
-#ifndef NDEBUG
- Address blinkPageAddr = roundToBlinkPageStart(address);
+ BaseHeapPage* cachedPage = heapContainsCache()->lookup(address);
+#ifdef NDEBUG
wibling-chromium 2014/05/09 10:25:20 Should this be removed as well?
+ if (cachedPage)
+ return cachedPage;
#endif
- ASSERT(page == m_heaps[i]->heapPageFromAddress(blinkPageAddr));
- ASSERT(page == m_heaps[i]->heapPageFromAddress(blinkPageAddr + blinkPageSize - 1));
- if (page)
- break;
- }
- heapContainsCache()->addEntry(address, page);
- return page; // 0 if not found.
-}
-BaseHeapPage* ThreadState::contains(Address address)
-{
- // Check heap contains cache first.
- BaseHeapPage* page = heapPageFromAddress(address);
- if (page)
- return page;
- // If no heap page was found check large objects.
for (int i = 0; i < NumberOfHeaps; i++) {
- page = m_heaps[i]->largeHeapObjectFromAddress(address);
- if (page)
+ BaseHeapPage* page = m_heaps[i]->heapPageFromAddress(address);
+ if (page) {
+ // Asserts that make sure heapPageFromAddress takes addresses from
+ // the whole aligned blinkPageSize memory area. This is necessary
+ // for the negative cache to work.
+ ASSERT(page->isLargeObject() || page == m_heaps[i]->heapPageFromAddress(roundToBlinkPageStart(address)));
+ if (roundToBlinkPageStart(address) != roundToBlinkPageEnd(address))
+ ASSERT(page->isLargeObject() || page == m_heaps[i]->heapPageFromAddress(roundToBlinkPageEnd(address) - 1));
+ ASSERT(!cachedPage || page == cachedPage);
+ if (!cachedPage)
+ heapContainsCache()->addEntry(address, page);
return page;
+ }
}
+ ASSERT(!cachedPage);
return 0;
}
« Source/platform/heap/Heap.cpp ('K') | « Source/platform/heap/ThreadState.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698