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

Side by Side Diff: third_party/WebKit/Source/platform/heap/PageMemory.h

Issue 1477023003: Refactor the Heap into ThreadHeap to prepare for per thread heaps Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Refactored Created 4 years, 11 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef PageMemory_h 5 #ifndef PageMemory_h
6 #define PageMemory_h 6 #define PageMemory_h
7 7
8 #include "platform/heap/HeapPage.h" 8 #include "platform/heap/HeapPage.h"
9 #include "wtf/Assertions.h" 9 #include "wtf/Assertions.h"
10 #include "wtf/PageAllocator.h" 10 #include "wtf/PageAllocator.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 { 68 {
69 ASSERT(!m_inUse[index(page)]); 69 ASSERT(!m_inUse[index(page)]);
70 m_inUse[index(page)] = true; 70 m_inUse[index(page)] = true;
71 } 71 }
72 72
73 void markPageUnused(Address page) 73 void markPageUnused(Address page)
74 { 74 {
75 m_inUse[index(page)] = false; 75 m_inUse[index(page)] = false;
76 } 76 }
77 77
78 static PageMemoryRegion* allocateLargePage(size_t size) 78 static PageMemoryRegion* allocateLargePage(size_t size, GCGroup* gcGroup)
79 { 79 {
80 return allocate(size, 1); 80 return allocate(size, 1, gcGroup);
81 } 81 }
82 82
83 static PageMemoryRegion* allocateNormalPages() 83 static PageMemoryRegion* allocateNormalPages(GCGroup* gcGroup)
84 { 84 {
85 return allocate(blinkPageSize * blinkPagesPerRegion, blinkPagesPerRegion ); 85 return allocate(blinkPageSize * blinkPagesPerRegion, blinkPagesPerRegion , gcGroup);
86 } 86 }
87 87
88 BasePage* pageFromAddress(Address address) 88 BasePage* pageFromAddress(Address address)
89 { 89 {
90 ASSERT(contains(address)); 90 ASSERT(contains(address));
91 if (!m_inUse[index(address)]) 91 if (!m_inUse[index(address)])
92 return nullptr; 92 return nullptr;
93 if (m_isLargePage) 93 if (m_isLargePage)
94 return pageFromObject(base()); 94 return pageFromObject(base());
95 return pageFromObject(address); 95 return pageFromObject(address);
96 } 96 }
97 97
98 private: 98 private:
99 PageMemoryRegion(Address base, size_t, unsigned numPages); 99 PageMemoryRegion(Address base, size_t, unsigned numPages, GCGroup*);
100 100
101 unsigned index(Address address) 101 unsigned index(Address address)
102 { 102 {
103 ASSERT(contains(address)); 103 ASSERT(contains(address));
104 if (m_isLargePage) 104 if (m_isLargePage)
105 return 0; 105 return 0;
106 size_t offset = blinkPageAddress(address) - base(); 106 size_t offset = blinkPageAddress(address) - base();
107 ASSERT(offset % blinkPageSize == 0); 107 ASSERT(offset % blinkPageSize == 0);
108 return offset / blinkPageSize; 108 return offset / blinkPageSize;
109 } 109 }
110 110
111 static PageMemoryRegion* allocate(size_t, unsigned numPages); 111 static PageMemoryRegion* allocate(size_t, unsigned numPages, GCGroup*);
112 112
113 bool m_isLargePage; 113 bool m_isLargePage;
114 bool m_inUse[blinkPagesPerRegion]; 114 bool m_inUse[blinkPagesPerRegion];
115 unsigned m_numPages; 115 unsigned m_numPages;
116 GCGroup* m_gcGroup;
116 }; 117 };
117 118
118 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted 119 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted
119 // by base addresses. 120 // by base addresses.
120 class RegionTree { 121 class RegionTree {
121 public: 122 public:
122 explicit RegionTree(PageMemoryRegion* region) 123 explicit RegionTree(PageMemoryRegion* region)
123 : m_region(region) 124 : m_region(region)
124 , m_left(nullptr) 125 , m_left(nullptr)
125 , m_right(nullptr) 126 , m_right(nullptr)
126 { 127 {
127 } 128 }
128 129
129 ~RegionTree() 130 ~RegionTree()
130 { 131 {
131 delete m_left; 132 delete m_left;
132 delete m_right; 133 delete m_right;
133 } 134 }
134 135
135 PageMemoryRegion* lookup(Address); 136 PageMemoryRegion* lookup(Address);
136 static void add(RegionTree*, RegionTree**); 137 static void add(RegionTree*, RegionTree**);
137 static void remove(PageMemoryRegion*, RegionTree**); 138 static void remove(PageMemoryRegion*, RegionTree**);
138 139
139 private: 140 private:
140 PageMemoryRegion* m_region; 141 PageMemoryRegion* m_region;
141 RegionTree* m_left; 142 RegionTree* m_left;
142 RegionTree* m_right; 143 RegionTree* m_right;
143
144 static RegionTree* s_regionTree;
145 }; 144 };
146 145
147 // Representation of the memory used for a Blink heap page. 146 // Representation of the memory used for a Blink heap page.
148 // 147 //
149 // The representation keeps track of two memory regions: 148 // The representation keeps track of two memory regions:
150 // 149 //
151 // 1. The virtual memory reserved from the system in order to be able 150 // 1. The virtual memory reserved from the system in order to be able
152 // to free all the virtual memory reserved. Multiple PageMemory 151 // to free all the virtual memory reserved. Multiple PageMemory
153 // instances can share the same reserved memory region and 152 // instances can share the same reserved memory region and
154 // therefore notify the reserved memory region on destruction so 153 // therefore notify the reserved memory region on destruction so
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 static PageMemory* setupPageMemoryInRegion(PageMemoryRegion*, size_t pageOff set, size_t payloadSize); 187 static PageMemory* setupPageMemoryInRegion(PageMemoryRegion*, size_t pageOff set, size_t payloadSize);
189 188
190 // Allocate a virtual address space for one blink page with the 189 // Allocate a virtual address space for one blink page with the
191 // following layout: 190 // following layout:
192 // 191 //
193 // [ guard os page | ... payload ... | guard os page ] 192 // [ guard os page | ... payload ... | guard os page ]
194 // ^---{ aligned to blink page size } 193 // ^---{ aligned to blink page size }
195 // 194 //
196 // The returned page memory region will be zeroed. 195 // The returned page memory region will be zeroed.
197 // 196 //
198 static PageMemory* allocate(size_t payloadSize); 197 static PageMemory* allocate(size_t payloadSize, GCGroup*);
199 198
200 private: 199 private:
201 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable); 200 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable);
202 201
203 PageMemoryRegion* m_reserved; 202 PageMemoryRegion* m_reserved;
204 MemoryRegion m_writable; 203 MemoryRegion m_writable;
205 }; 204 };
206 205
207 } // namespace blink 206 } // namespace blink
208 207
209 #endif 208 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698