Chromium Code Reviews| 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" |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |