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

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: Created 4 years, 9 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/Allocator.h" 9 #include "wtf/Allocator.h"
10 #include "wtf/Assertions.h" 10 #include "wtf/Assertions.h"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 { 70 {
71 ASSERT(!m_inUse[index(page)]); 71 ASSERT(!m_inUse[index(page)]);
72 m_inUse[index(page)] = true; 72 m_inUse[index(page)] = true;
73 } 73 }
74 74
75 void markPageUnused(Address page) 75 void markPageUnused(Address page)
76 { 76 {
77 m_inUse[index(page)] = false; 77 m_inUse[index(page)] = false;
78 } 78 }
79 79
80 static PageMemoryRegion* allocateLargePage(size_t size) 80 static PageMemoryRegion* allocateLargePage(size_t size, Heap* heap)
81 { 81 {
82 return allocate(size, 1); 82 return allocate(size, 1, heap);
83 } 83 }
84 84
85 static PageMemoryRegion* allocateNormalPages() 85 static PageMemoryRegion* allocateNormalPages(Heap* heap)
86 { 86 {
87 return allocate(blinkPageSize * blinkPagesPerRegion, blinkPagesPerRegion ); 87 return allocate(blinkPageSize * blinkPagesPerRegion, blinkPagesPerRegion , heap);
88 } 88 }
89 89
90 BasePage* pageFromAddress(Address address) 90 BasePage* pageFromAddress(Address address)
91 { 91 {
92 ASSERT(contains(address)); 92 ASSERT(contains(address));
93 if (!m_inUse[index(address)]) 93 if (!m_inUse[index(address)])
94 return nullptr; 94 return nullptr;
95 if (m_isLargePage) 95 if (m_isLargePage)
96 return pageFromObject(base()); 96 return pageFromObject(base());
97 return pageFromObject(address); 97 return pageFromObject(address);
98 } 98 }
99 99
100 private: 100 private:
101 PageMemoryRegion(Address base, size_t, unsigned numPages); 101 PageMemoryRegion(Address base, size_t, unsigned numPages, Heap*);
102 102
103 unsigned index(Address address) 103 unsigned index(Address address)
104 { 104 {
105 ASSERT(contains(address)); 105 ASSERT(contains(address));
106 if (m_isLargePage) 106 if (m_isLargePage)
107 return 0; 107 return 0;
108 size_t offset = blinkPageAddress(address) - base(); 108 size_t offset = blinkPageAddress(address) - base();
109 ASSERT(offset % blinkPageSize == 0); 109 ASSERT(offset % blinkPageSize == 0);
110 return offset / blinkPageSize; 110 return offset / blinkPageSize;
111 } 111 }
112 112
113 static PageMemoryRegion* allocate(size_t, unsigned numPages); 113 static PageMemoryRegion* allocate(size_t, unsigned numPages, Heap*);
114 114
115 bool m_isLargePage; 115 bool m_isLargePage;
116 bool m_inUse[blinkPagesPerRegion]; 116 bool m_inUse[blinkPagesPerRegion];
117 unsigned m_numPages; 117 unsigned m_numPages;
118 Heap* m_heap;
118 }; 119 };
119 120
120 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted 121 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted
121 // by base addresses. 122 // by base addresses.
122 class RegionTree { 123 class RegionTree {
123 USING_FAST_MALLOC(RegionTree); 124 USING_FAST_MALLOC(RegionTree);
124 public: 125 public:
125 explicit RegionTree(PageMemoryRegion* region) 126 explicit RegionTree(PageMemoryRegion* region)
126 : m_region(region) 127 : m_region(region)
127 , m_left(nullptr) 128 , m_left(nullptr)
128 , m_right(nullptr) 129 , m_right(nullptr)
129 { 130 {
130 } 131 }
131 132
132 ~RegionTree() 133 ~RegionTree()
133 { 134 {
134 delete m_left; 135 delete m_left;
135 delete m_right; 136 delete m_right;
136 } 137 }
137 138
138 PageMemoryRegion* lookup(Address); 139 PageMemoryRegion* lookup(Address);
139 static void add(RegionTree*, RegionTree**); 140 static void add(RegionTree*, RegionTree**);
140 static void remove(PageMemoryRegion*, RegionTree**); 141 static void remove(PageMemoryRegion*, RegionTree**);
141 142
142 private: 143 private:
143 PageMemoryRegion* m_region; 144 PageMemoryRegion* m_region;
144 RegionTree* m_left; 145 RegionTree* m_left;
145 RegionTree* m_right; 146 RegionTree* m_right;
146
147 static RegionTree* s_regionTree;
148 }; 147 };
149 148
150 // Representation of the memory used for a Blink heap page. 149 // Representation of the memory used for a Blink heap page.
151 // 150 //
152 // The representation keeps track of two memory regions: 151 // The representation keeps track of two memory regions:
153 // 152 //
154 // 1. The virtual memory reserved from the system in order to be able 153 // 1. The virtual memory reserved from the system in order to be able
155 // to free all the virtual memory reserved. Multiple PageMemory 154 // to free all the virtual memory reserved. Multiple PageMemory
156 // instances can share the same reserved memory region and 155 // instances can share the same reserved memory region and
157 // therefore notify the reserved memory region on destruction so 156 // therefore notify the reserved memory region on destruction so
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 static PageMemory* setupPageMemoryInRegion(PageMemoryRegion*, size_t pageOff set, size_t payloadSize); 191 static PageMemory* setupPageMemoryInRegion(PageMemoryRegion*, size_t pageOff set, size_t payloadSize);
193 192
194 // Allocate a virtual address space for one blink page with the 193 // Allocate a virtual address space for one blink page with the
195 // following layout: 194 // following layout:
196 // 195 //
197 // [ guard os page | ... payload ... | guard os page ] 196 // [ guard os page | ... payload ... | guard os page ]
198 // ^---{ aligned to blink page size } 197 // ^---{ aligned to blink page size }
199 // 198 //
200 // The returned page memory region will be zeroed. 199 // The returned page memory region will be zeroed.
201 // 200 //
202 static PageMemory* allocate(size_t payloadSize); 201 static PageMemory* allocate(size_t payloadSize, Heap*);
203 202
204 private: 203 private:
205 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable); 204 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable);
206 205
207 PageMemoryRegion* m_reserved; 206 PageMemoryRegion* m_reserved;
208 MemoryRegion m_writable; 207 MemoryRegion m_writable;
209 }; 208 };
210 209
211 } // namespace blink 210 } // namespace blink
212 211
213 #endif 212 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698