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

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

Issue 798293002: Oilpan: attempt first-fit freelist allocation for backing heaps. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebased Created 6 years 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 | « no previous file | Source/platform/heap/Heap.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/heap/Heap.h
diff --git a/Source/platform/heap/Heap.h b/Source/platform/heap/Heap.h
index a4a502815ac21ce6b17e7800f67dcba5ec7e72bc..01fed7577414188f53f249d979842b85038332dd 100644
--- a/Source/platform/heap/Heap.h
+++ b/Source/platform/heap/Heap.h
@@ -723,7 +723,6 @@ public:
void addToFreeList(Address, size_t);
void clear();
- FreeListEntry* takeEntry(size_t allocationSize);
// Returns a bucket number for inserting a FreeListEntry of a given size.
// All FreeListEntries in the given bucket, n, have size >= 2^n.
@@ -735,9 +734,7 @@ private:
// All FreeListEntries in the nth list have size >= 2^n.
FreeListEntry* m_freeLists[blinkPageSizeLog2];
-#if ENABLE(ASSERT)
friend class ThreadHeap<Header>;
-#endif
};
// Thread heaps represent a part of the per-thread Blink heap.
@@ -786,7 +783,7 @@ public:
m_freeList.addToFreeList(address, size);
}
- inline Address allocate(size_t, const GCInfo*);
+ inline Address allocate(size_t payloadSize, const GCInfo*);
inline static size_t roundedAllocationSize(size_t size)
{
return allocationSizeFromSize(size) - sizeof(Header);
@@ -802,7 +799,7 @@ public:
private:
void addPageToHeap(const GCInfo*);
- PLATFORM_EXPORT Address outOfLineAllocate(size_t payloadSize, size_t allocationSize, const GCInfo*);
+ PLATFORM_EXPORT Address outOfLineAllocate(size_t allocationSize, const GCInfo*);
static size_t allocationSizeFromSize(size_t);
PLATFORM_EXPORT Address allocateLargeObject(size_t, const GCInfo*);
Address currentAllocationPoint() const { return m_currentAllocationPoint; }
@@ -819,11 +816,14 @@ private:
m_lastRemainingAllocationSize = m_remainingAllocationSize = size;
}
void updateRemainingAllocationSize();
- bool allocateFromFreeList(size_t);
+ Address allocateFromFreeList(size_t, const GCInfo*);
void freeLargeObject(LargeObject<Header>*, LargeObject<Header>**);
void allocatePage(const GCInfo*);
+ inline Address allocateSize(size_t allocationSize, const GCInfo*);
+ inline Address allocateAtAddress(Address, size_t allocationSize, const GCInfo*);
+
#if ENABLE(ASSERT)
bool pagesToBeSweptContains(Address);
bool pagesAllocatedDuringSweepingContains(Address);
@@ -1282,25 +1282,37 @@ size_t ThreadHeap<Header>::allocationSizeFromSize(size_t size)
return allocationSize;
}
+
template<typename Header>
-Address ThreadHeap<Header>::allocate(size_t size, const GCInfo* gcInfo)
+inline Address ThreadHeap<Header>::allocateAtAddress(Address headerAddress, size_t allocationSize, const GCInfo* gcInfo)
+{
+ new (NotNull, headerAddress) Header(allocationSize, gcInfo);
+ Address result = headerAddress + sizeof(Header);
+ ASSERT(!(reinterpret_cast<uintptr_t>(result) & allocationMask));
+
+ // Unpoison the memory used for the object (payload).
+ ASAN_UNPOISON_MEMORY_REGION(result, allocationSize - sizeof(Header));
+ FILL_ZERO_IF_NOT_PRODUCTION(result, allocationSize - sizeof(Header));
+ ASSERT(pageFromAddress(headerAddress + allocationSize - 1));
+ return result;
+}
+
+template<typename Header>
+Address ThreadHeap<Header>::allocateSize(size_t allocationSize, const GCInfo* gcInfo)
{
- size_t allocationSize = allocationSizeFromSize(size);
if (LIKELY(allocationSize <= m_remainingAllocationSize)) {
Address headerAddress = m_currentAllocationPoint;
m_currentAllocationPoint += allocationSize;
m_remainingAllocationSize -= allocationSize;
- new (NotNull, headerAddress) Header(allocationSize, gcInfo);
- Address result = headerAddress + sizeof(Header);
- ASSERT(!(reinterpret_cast<uintptr_t>(result) & allocationMask));
-
- // Unpoison the memory used for the object (payload).
- ASAN_UNPOISON_MEMORY_REGION(result, allocationSize - sizeof(Header));
- FILL_ZERO_IF_NOT_PRODUCTION(result, allocationSize - sizeof(Header));
- ASSERT(pageFromAddress(headerAddress + allocationSize - 1));
- return result;
+ return allocateAtAddress(headerAddress, allocationSize, gcInfo);
}
- return outOfLineAllocate(size, allocationSize, gcInfo);
+ return outOfLineAllocate(allocationSize, gcInfo);
+}
+
+template<typename Header>
+Address ThreadHeap<Header>::allocate(size_t size, const GCInfo* gcInfo)
+{
+ return allocateSize(allocationSizeFromSize(size), gcInfo);
}
template<typename T, typename HeapTraits>
« no previous file with comments | « no previous file | Source/platform/heap/Heap.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698