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

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

Issue 1748363005: Use a bitmap to record PageMemoryRegion usage. (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
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/heap/PageMemory.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 61
62 void pageDeleted(Address page) 62 void pageDeleted(Address page)
63 { 63 {
64 markPageUnused(page); 64 markPageUnused(page);
65 if (!--m_numPages) 65 if (!--m_numPages)
66 delete this; 66 delete this;
67 } 67 }
68 68
69 void markPageUsed(Address page) 69 void markPageUsed(Address page)
70 { 70 {
71 ASSERT(!m_inUse[index(page)]); 71 ASSERT(!(m_inUseBitmap & index(page)));
72 m_inUse[index(page)] = true; 72 m_inUseBitmap |= index(page);
73 } 73 }
74 74
75 void markPageUnused(Address page) 75 void markPageUnused(Address page)
76 { 76 {
77 m_inUse[index(page)] = false; 77 m_inUseBitmap &= ~index(page);
78 } 78 }
79 79
80 static PageMemoryRegion* allocateLargePage(size_t size) 80 static PageMemoryRegion* allocateLargePage(size_t size)
81 { 81 {
82 return allocate(size, 1); 82 return allocate(size, 1);
83 } 83 }
84 84
85 static PageMemoryRegion* allocateNormalPages() 85 static PageMemoryRegion* allocateNormalPages()
86 { 86 {
87 return allocate(blinkPageSize * blinkPagesPerRegion, blinkPagesPerRegion ); 87 return allocate(blinkPageSize * blinkPagesPerRegion, blinkPagesPerRegion );
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_inUseBitmap & 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);
102 102
103 unsigned index(Address address) 103 // Returns word with the bit set which corresponds to the |address|'
104 // page within a region.
105 unsigned index(Address address) const
104 { 106 {
105 ASSERT(contains(address)); 107 ASSERT(contains(address));
106 if (m_isLargePage) 108 if (m_isLargePage)
107 return 0; 109 return 0x1;
108 size_t offset = blinkPageAddress(address) - base(); 110 size_t offset = blinkPageAddress(address) - base();
109 ASSERT(offset % blinkPageSize == 0); 111 ASSERT(offset % blinkPageSize == 0);
110 return offset / blinkPageSize; 112 return 0x1 << (offset / blinkPageSize);
111 } 113 }
112 114
113 static PageMemoryRegion* allocate(size_t, unsigned numPages); 115 static PageMemoryRegion* allocate(size_t, unsigned numPages);
114 116
115 bool m_isLargePage; 117 bool m_isLargePage;
116 bool m_inUse[blinkPagesPerRegion]; 118 unsigned m_inUseBitmap;
117 unsigned m_numPages; 119 unsigned m_numPages;
118 }; 120 };
119 121
120 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted 122 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted
121 // by base addresses. 123 // by base addresses.
122 class RegionTree { 124 class RegionTree {
123 USING_FAST_MALLOC(RegionTree); 125 USING_FAST_MALLOC(RegionTree);
124 public: 126 public:
125 explicit RegionTree(PageMemoryRegion* region) 127 explicit RegionTree(PageMemoryRegion* region)
126 : m_region(region) 128 : m_region(region)
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 private: 206 private:
205 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable); 207 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable);
206 208
207 PageMemoryRegion* m_reserved; 209 PageMemoryRegion* m_reserved;
208 MemoryRegion m_writable; 210 MemoryRegion m_writable;
209 }; 211 };
210 212
211 } // namespace blink 213 } // namespace blink
212 214
213 #endif 215 #endif
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/heap/PageMemory.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698