| 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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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_inUseBitmap & index(page))); | 71 ASSERT(!m_inUse[index(page)]); |
| 72 m_inUseBitmap |= index(page); | 72 m_inUse[index(page)] = true; |
| 73 } | 73 } |
| 74 | 74 |
| 75 void markPageUnused(Address page) | 75 void markPageUnused(Address page) |
| 76 { | 76 { |
| 77 m_inUseBitmap &= ~index(page); | 77 m_inUse[index(page)] = false; |
| 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_inUseBitmap & 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); |
| 102 | 102 |
| 103 // Returns word with the bit set which corresponds to the |address|' | 103 unsigned index(Address address) |
| 104 // page within a region. | |
| 105 unsigned index(Address address) const | |
| 106 { | 104 { |
| 107 ASSERT(contains(address)); | 105 ASSERT(contains(address)); |
| 108 if (m_isLargePage) | 106 if (m_isLargePage) |
| 109 return 0x1; | 107 return 0; |
| 110 size_t offset = blinkPageAddress(address) - base(); | 108 size_t offset = blinkPageAddress(address) - base(); |
| 111 ASSERT(offset % blinkPageSize == 0); | 109 ASSERT(offset % blinkPageSize == 0); |
| 112 return 0x1 << (offset / blinkPageSize); | 110 return offset / blinkPageSize; |
| 113 } | 111 } |
| 114 | 112 |
| 115 static PageMemoryRegion* allocate(size_t, unsigned numPages); | 113 static PageMemoryRegion* allocate(size_t, unsigned numPages); |
| 116 | 114 |
| 117 bool m_isLargePage; | 115 bool m_isLargePage; |
| 118 unsigned m_inUseBitmap; | 116 bool m_inUse[blinkPagesPerRegion]; |
| 119 unsigned m_numPages; | 117 unsigned m_numPages; |
| 120 }; | 118 }; |
| 121 | 119 |
| 122 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted | 120 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted |
| 123 // by base addresses. | 121 // by base addresses. |
| 124 class RegionTree { | 122 class RegionTree { |
| 125 USING_FAST_MALLOC(RegionTree); | 123 USING_FAST_MALLOC(RegionTree); |
| 126 public: | 124 public: |
| 127 explicit RegionTree(PageMemoryRegion* region) | 125 explicit RegionTree(PageMemoryRegion* region) |
| 128 : m_region(region) | 126 : m_region(region) |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 private: | 204 private: |
| 207 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable); | 205 PageMemory(PageMemoryRegion* reserved, const MemoryRegion& writable); |
| 208 | 206 |
| 209 PageMemoryRegion* m_reserved; | 207 PageMemoryRegion* m_reserved; |
| 210 MemoryRegion m_writable; | 208 MemoryRegion m_writable; |
| 211 }; | 209 }; |
| 212 | 210 |
| 213 } // namespace blink | 211 } // namespace blink |
| 214 | 212 |
| 215 #endif | 213 #endif |
| OLD | NEW |