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