Index: third_party/WebKit/Source/platform/heap/HeapPage.h |
diff --git a/third_party/WebKit/Source/platform/heap/HeapPage.h b/third_party/WebKit/Source/platform/heap/HeapPage.h |
index a006d41adf842693779de4f04436644eacf6caf0..3a43031bba9374f1cfc581d758a89aa01ccb96b8 100644 |
--- a/third_party/WebKit/Source/platform/heap/HeapPage.h |
+++ b/third_party/WebKit/Source/platform/heap/HeapPage.h |
@@ -512,6 +512,26 @@ class NormalPage final : public BasePage { |
inline NormalPageArena* arenaForNormalPage() const; |
+ // Context object holding the state of the arena page compaction pass, |
+ // passed in when compacting individual pages. |
+ class CompactionContext { |
+ STACK_ALLOCATED(); |
+ |
+ public: |
+ // Page compacting into. |
+ NormalPage* m_currentPage = nullptr; |
+ // Offset into |m_currentPage| to the next free address. |
+ size_t m_allocationPoint = 0; |
+ // Chain of available pages to use for compaction. Page compaction |
+ // picks the next one when the current one is exhausted. |
+ BasePage* m_availablePages = nullptr; |
+ // Chain of pages that have been compacted. Page compaction will |
+ // add compacted pages once the current one becomes exhausted. |
+ BasePage** m_compactedPages = nullptr; |
+ }; |
+ |
+ void sweepAndCompact(CompactionContext&); |
+ |
private: |
HeapObjectHeader* findHeaderFromAddress(Address); |
void populateObjectStartBitMap(); |
@@ -665,6 +685,8 @@ class FreeList { |
// All FreeListEntries in the nth list have size >= 2^n. |
FreeListEntry* m_freeLists[blinkPageSizeLog2]; |
+ size_t freeListSize() const; |
+ |
friend class NormalPageArena; |
}; |
@@ -761,8 +783,14 @@ class PLATFORM_EXPORT NormalPageArena final : public BaseArena { |
bool isLazySweeping() const { return m_isLazySweeping; } |
void setIsLazySweeping(bool flag) { m_isLazySweeping = flag; } |
+ size_t arenaSize(); |
+ size_t freeListSize(); |
+ |
+ void sweepAndCompact(); |
+ |
private: |
void allocatePage(); |
+ |
Address outOfLineAllocate(size_t allocationSize, size_t gcInfoIndex); |
Address allocateFromFreeList(size_t, size_t gcInfoIndex); |