| 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |