| 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/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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |