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

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

Issue 711053002: Prepare for incremental sweep by making the FreeList independent of the ThreadHeap (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
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') | 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 613a6b472dbef34dde58c359553f778027d9268f..5bc7881f91f8feccfe38ce34d6e357bba4438a6b 100644
--- a/Source/platform/heap/Heap.cpp
+++ b/Source/platform/heap/Heap.cpp
@@ -648,7 +648,6 @@ ThreadHeap<Header>::ThreadHeap(ThreadState* state, int index)
, m_firstPageAllocatedDuringSweeping(0)
, m_lastPageAllocatedDuringSweeping(0)
, m_mergePoint(0)
- , m_biggestFreeListIndex(0)
, m_threadState(state)
, m_index(index)
, m_numberOfNormalPages(0)
@@ -658,6 +657,12 @@ ThreadHeap<Header>::ThreadHeap(ThreadState* state, int index)
}
template<typename Header>
+FreeList<Header>::FreeList()
+ : m_biggestFreeListIndex(0)
+{
+}
+
+template<typename Header>
ThreadHeap<Header>::~ThreadHeap()
{
ASSERT(!m_firstPage);
@@ -705,7 +710,7 @@ Address ThreadHeap<Header>::outOfLineAllocate(size_t size, const GCInfo* gcInfo)
threadState()->setGCRequested();
}
if (remainingAllocationSize() > 0) {
- addToFreeList(currentAllocationPoint(), remainingAllocationSize());
+ m_freeList.addToFreeList(currentAllocationPoint(), remainingAllocationSize());
setAllocationPoint(0, 0);
}
ensureCurrentAllocation(allocationSize, gcInfo);
@@ -715,21 +720,21 @@ Address ThreadHeap<Header>::outOfLineAllocate(size_t size, const GCInfo* gcInfo)
template<typename Header>
bool ThreadHeap<Header>::allocateFromFreeList(size_t minSize)
{
- size_t bucketSize = 1 << m_biggestFreeListIndex;
- int i = m_biggestFreeListIndex;
+ size_t bucketSize = 1 << m_freeList.m_biggestFreeListIndex;
+ int i = m_freeList.m_biggestFreeListIndex;
for (; i > 0; i--, bucketSize >>= 1) {
if (bucketSize < minSize)
break;
- FreeListEntry* entry = m_freeLists[i];
+ FreeListEntry* entry = m_freeList.m_freeLists[i];
if (entry) {
- m_biggestFreeListIndex = i;
- entry->unlink(&m_freeLists[i]);
+ m_freeList.m_biggestFreeListIndex = i;
+ entry->unlink(&m_freeList.m_freeLists[i]);
setAllocationPoint(entry->address(), entry->size());
ASSERT(currentAllocationPoint() && remainingAllocationSize() >= minSize);
return true;
}
}
- m_biggestFreeListIndex = i;
+ m_freeList.m_biggestFreeListIndex = i;
return false;
}
@@ -813,10 +818,8 @@ void ThreadHeap<Header>::snapshot(TracedValue* json, ThreadState::SnapshotInfo*
#endif
template<typename Header>
-void ThreadHeap<Header>::addToFreeList(Address address, size_t size)
+void FreeList<Header>::addToFreeList(Address address, size_t size)
{
- ASSERT(heapPageFromAddress(address));
- ASSERT(heapPageFromAddress(address + size - 1));
ASSERT(size < blinkPagePayloadSize());
// The free list entries are only pointer aligned (but when we allocate
// from them we are 8 byte aligned due to the header size).
@@ -886,7 +889,7 @@ bool ThreadHeap<Header>::coalesce(size_t minSize)
// The smallest bucket able to satisfy an allocation request for minSize is
// the bucket where all free-list entries are guarantied to be larger than
// minSize. That bucket is one larger than the bucket minSize would go into.
- size_t neededBucketIndex = bucketIndexForSize(minSize) + 1;
+ size_t neededBucketIndex = FreeList<Header>::bucketIndexForSize(minSize) + 1;
size_t neededFreeEntrySize = 1 << neededBucketIndex;
size_t neededPromptlyFreedSize = neededFreeEntrySize * 3;
size_t foundFreeEntrySize = 0;
@@ -1430,7 +1433,7 @@ bool ThreadHeap<Header>::isConsistentForSweeping()
// be swept contain a freelist block or the current allocation
// point.
for (size_t i = 0; i < blinkPageSizeLog2; i++) {
- for (FreeListEntry* freeListEntry = m_freeLists[i]; freeListEntry; freeListEntry = freeListEntry->next()) {
+ for (FreeListEntry* freeListEntry = m_freeList.m_freeLists[i]; freeListEntry; freeListEntry = freeListEntry->next()) {
if (pagesToBeSweptContains(freeListEntry->address())) {
return false;
}
@@ -1473,13 +1476,21 @@ template<typename Header>
void ThreadHeap<Header>::clearFreeLists()
{
m_promptlyFreedCount = 0;
+ m_freeList.clear();
+}
+
+template<typename Header>
+void FreeList<Header>::clear()
+{
+ m_biggestFreeListIndex = 0;
for (size_t i = 0; i < blinkPageSizeLog2; i++) {
m_freeLists[i] = 0;
m_lastFreeListEntries[i] = 0;
}
}
-int BaseHeap::bucketIndexForSize(size_t size)
+template<typename Header>
+int FreeList<Header>::bucketIndexForSize(size_t size)
{
ASSERT(size > 0);
int index = -1;
@@ -2743,11 +2754,11 @@ void ThreadHeap<Header>::merge(PassOwnPtr<BaseHeap> splitOffBase)
splitOff->m_firstPage = 0;
// Merge free lists.
for (size_t i = 0; i < blinkPageSizeLog2; i++) {
- if (!m_freeLists[i]) {
- m_freeLists[i] = splitOff->m_freeLists[i];
- } else if (splitOff->m_freeLists[i]) {
- m_lastFreeListEntries[i]->append(splitOff->m_freeLists[i]);
- m_lastFreeListEntries[i] = splitOff->m_lastFreeListEntries[i];
+ if (!m_freeList.m_freeLists[i]) {
+ m_freeList.m_freeLists[i] = splitOff->m_freeList.m_freeLists[i];
+ } else if (splitOff->m_freeList.m_freeLists[i]) {
+ m_freeList.m_lastFreeListEntries[i]->append(splitOff->m_freeList.m_freeLists[i]);
+ m_freeList.m_lastFreeListEntries[i] = splitOff->m_freeList.m_lastFreeListEntries[i];
}
}
}
« no previous file with comments | « Source/platform/heap/Heap.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698