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

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

Issue 1804863002: Refactor RegionTree (Closed) 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"
11 #include "wtf/PageAllocator.h" 11 #include "wtf/PageAllocator.h"
12 12
13 #if OS(POSIX) 13 #if OS(POSIX)
14 #include <sys/mman.h> 14 #include <sys/mman.h>
15 #include <unistd.h> 15 #include <unistd.h>
16 #endif 16 #endif
17 17
18 namespace blink { 18 namespace blink {
19 19
20 class RegionTree;
21 class RegionTreeNode;
22
20 class MemoryRegion { 23 class MemoryRegion {
21 USING_FAST_MALLOC(MemoryRegion); 24 USING_FAST_MALLOC(MemoryRegion);
22 public: 25 public:
23 MemoryRegion(Address base, size_t size) 26 MemoryRegion(Address base, size_t size)
24 : m_base(base) 27 : m_base(base)
25 , m_size(size) 28 , m_size(size)
26 { 29 {
27 ASSERT(size > 0); 30 ASSERT(size > 0);
28 } 31 }
29 32
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 BasePage* pageFromAddress(Address address) 88 BasePage* pageFromAddress(Address address)
86 { 89 {
87 ASSERT(contains(address)); 90 ASSERT(contains(address));
88 if (!m_inUse[index(address)]) 91 if (!m_inUse[index(address)])
89 return nullptr; 92 return nullptr;
90 if (m_isLargePage) 93 if (m_isLargePage)
91 return pageFromObject(base()); 94 return pageFromObject(base());
92 return pageFromObject(address); 95 return pageFromObject(address);
93 } 96 }
94 97
98 void setRegionTree(RegionTree* tree) { m_regionTree = tree; }
99 RegionTree* getRegionTree() const { return m_regionTree; }
haraken 2016/03/15 05:49:50 Is this used?
keishi 2016/03/15 07:48:43 Removed.
100
95 private: 101 private:
96 PageMemoryRegion(Address base, size_t, unsigned numPages); 102 PageMemoryRegion(Address base, size_t, unsigned numPages);
97 103
98 unsigned index(Address address) const 104 unsigned index(Address address) const
99 { 105 {
100 ASSERT(contains(address)); 106 ASSERT(contains(address));
101 if (m_isLargePage) 107 if (m_isLargePage)
102 return 0; 108 return 0;
103 size_t offset = blinkPageAddress(address) - base(); 109 size_t offset = blinkPageAddress(address) - base();
104 ASSERT(offset % blinkPageSize == 0); 110 ASSERT(offset % blinkPageSize == 0);
105 return offset / blinkPageSize; 111 return offset / blinkPageSize;
106 } 112 }
107 113
108 static PageMemoryRegion* allocate(size_t, unsigned numPages); 114 static PageMemoryRegion* allocate(size_t, unsigned numPages);
109 115
110 const bool m_isLargePage; 116 const bool m_isLargePage;
111 // A thread owns a page, but not a region. Represent the in-use 117 // A thread owns a page, but not a region. Represent the in-use
112 // bitmap such that thread non-interference comes for free. 118 // bitmap such that thread non-interference comes for free.
113 bool m_inUse[blinkPagesPerRegion]; 119 bool m_inUse[blinkPagesPerRegion];
114 int m_numPages; 120 int m_numPages;
121 RegionTree* m_regionTree;
115 }; 122 };
116 123
117 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted 124 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted
118 // by base addresses. 125 // by base addresses.
119 class RegionTree { 126 class RegionTree {
120 USING_FAST_MALLOC(RegionTree); 127 USING_FAST_MALLOC(RegionTree);
121 public: 128 public:
122 explicit RegionTree(PageMemoryRegion* region) 129 RegionTree() : m_root(nullptr) { }
130
131 void add(PageMemoryRegion*);
132 void remove(PageMemoryRegion*);
133 PageMemoryRegion* lookup(Address);
134
135 private:
136 Mutex m_mutex;
137 RegionTreeNode* m_root;
138 };
139
140 class RegionTreeNode {
141 USING_FAST_MALLOC(RegionTreeNode);
142 public:
143 explicit RegionTreeNode(PageMemoryRegion* region)
123 : m_region(region) 144 : m_region(region)
124 , m_left(nullptr) 145 , m_left(nullptr)
125 , m_right(nullptr) 146 , m_right(nullptr)
126 { 147 {
127 } 148 }
128 149
129 ~RegionTree() 150 ~RegionTreeNode()
130 { 151 {
131 delete m_left; 152 delete m_left;
132 delete m_right; 153 delete m_right;
133 } 154 }
134 155
135 PageMemoryRegion* lookup(Address); 156 void addTo(RegionTreeNode** context);
136 static void add(RegionTree*, RegionTree**);
137 static void remove(PageMemoryRegion*, RegionTree**);
138 157
139 private: 158 private:
140 PageMemoryRegion* m_region; 159 PageMemoryRegion* m_region;
141 RegionTree* m_left; 160 RegionTreeNode* m_left;
142 RegionTree* m_right; 161 RegionTreeNode* m_right;
143 162
144 static RegionTree* s_regionTree; 163 friend RegionTree;
145 }; 164 };
146 165
147 // Representation of the memory used for a Blink heap page. 166 // Representation of the memory used for a Blink heap page.
148 // 167 //
149 // The representation keeps track of two memory regions: 168 // The representation keeps track of two memory regions:
150 // 169 //
151 // 1. The virtual memory reserved from the system in order to be able 170 // 1. The virtual memory reserved from the system in order to be able
152 // to free all the virtual memory reserved. Multiple PageMemory 171 // to free all the virtual memory reserved. Multiple PageMemory
153 // instances can share the same reserved memory region and 172 // instances can share the same reserved memory region and
154 // therefore notify the reserved memory region on destruction so 173 // therefore notify the reserved memory region on destruction so
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 private: 220 private:
202 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable); 221 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable);
203 222
204 PageMemoryRegion* m_reserved; 223 PageMemoryRegion* m_reserved;
205 MemoryRegion m_writable; 224 MemoryRegion m_writable;
206 }; 225 };
207 226
208 } // namespace blink 227 } // namespace blink
209 228
210 #endif 229 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698