OLD | NEW |
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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 // A PageMemoryRegion represents a chunk of reserved virtual address | 52 // A PageMemoryRegion represents a chunk of reserved virtual address |
53 // space containing a number of blink heap pages. On Windows, reserved | 53 // space containing a number of blink heap pages. On Windows, reserved |
54 // virtual address space can only be given back to the system as a | 54 // virtual address space can only be given back to the system as a |
55 // whole. The PageMemoryRegion allows us to do that by keeping track | 55 // whole. The PageMemoryRegion allows us to do that by keeping track |
56 // of the number of pages using it in order to be able to release all | 56 // of the number of pages using it in order to be able to release all |
57 // of the virtual address space when there are no more pages using it. | 57 // of the virtual address space when there are no more pages using it. |
58 class PageMemoryRegion : public MemoryRegion { | 58 class PageMemoryRegion : public MemoryRegion { |
59 public: | 59 public: |
60 ~PageMemoryRegion(); | 60 ~PageMemoryRegion(); |
61 | 61 |
62 void pageDeleted(Address page) | 62 void pageDeleted(Address); |
63 { | |
64 markPageUnused(page); | |
65 if (!--m_numPages) | |
66 delete this; | |
67 } | |
68 | 63 |
69 void markPageUsed(Address page) | 64 void markPageUsed(Address page) |
70 { | 65 { |
71 ASSERT(!m_inUse[index(page)]); | 66 ASSERT(!m_inUse[index(page)]); |
72 m_inUse[index(page)] = true; | 67 m_inUse[index(page)] = true; |
73 } | 68 } |
74 | 69 |
75 void markPageUnused(Address page) | 70 void markPageUnused(Address page) |
76 { | 71 { |
77 m_inUse[index(page)] = false; | 72 m_inUse[index(page)] = false; |
(...skipping 15 matching lines...) Expand all Loading... |
93 if (!m_inUse[index(address)]) | 88 if (!m_inUse[index(address)]) |
94 return nullptr; | 89 return nullptr; |
95 if (m_isLargePage) | 90 if (m_isLargePage) |
96 return pageFromObject(base()); | 91 return pageFromObject(base()); |
97 return pageFromObject(address); | 92 return pageFromObject(address); |
98 } | 93 } |
99 | 94 |
100 private: | 95 private: |
101 PageMemoryRegion(Address base, size_t, unsigned numPages); | 96 PageMemoryRegion(Address base, size_t, unsigned numPages); |
102 | 97 |
103 unsigned index(Address address) | 98 unsigned index(Address address) const |
104 { | 99 { |
105 ASSERT(contains(address)); | 100 ASSERT(contains(address)); |
106 if (m_isLargePage) | 101 if (m_isLargePage) |
107 return 0; | 102 return 0; |
108 size_t offset = blinkPageAddress(address) - base(); | 103 size_t offset = blinkPageAddress(address) - base(); |
109 ASSERT(offset % blinkPageSize == 0); | 104 ASSERT(offset % blinkPageSize == 0); |
110 return offset / blinkPageSize; | 105 return offset / blinkPageSize; |
111 } | 106 } |
112 | 107 |
113 static PageMemoryRegion* allocate(size_t, unsigned numPages); | 108 static PageMemoryRegion* allocate(size_t, unsigned numPages); |
114 | 109 |
115 bool m_isLargePage; | 110 const bool m_isLargePage; |
| 111 // A thread owns a page, but not a region. Represent the in-use |
| 112 // bitmap such that thread non-interference comes for free. |
116 bool m_inUse[blinkPagesPerRegion]; | 113 bool m_inUse[blinkPagesPerRegion]; |
117 unsigned m_numPages; | 114 int m_numPages; |
118 }; | 115 }; |
119 | 116 |
120 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted | 117 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted |
121 // by base addresses. | 118 // by base addresses. |
122 class RegionTree { | 119 class RegionTree { |
123 USING_FAST_MALLOC(RegionTree); | 120 USING_FAST_MALLOC(RegionTree); |
124 public: | 121 public: |
125 explicit RegionTree(PageMemoryRegion* region) | 122 explicit RegionTree(PageMemoryRegion* region) |
126 : m_region(region) | 123 : m_region(region) |
127 , m_left(nullptr) | 124 , m_left(nullptr) |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 private: | 201 private: |
205 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable); | 202 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable); |
206 | 203 |
207 PageMemoryRegion* m_reserved; | 204 PageMemoryRegion* m_reserved; |
208 MemoryRegion m_writable; | 205 MemoryRegion m_writable; |
209 }; | 206 }; |
210 | 207 |
211 } // namespace blink | 208 } // namespace blink |
212 | 209 |
213 #endif | 210 #endif |
OLD | NEW |