Changeset 180693 in webkit
- Timestamp:
- Feb 26, 2015 12:05:14 PM (9 years ago)
- Location:
- trunk/Source/bmalloc
- Files:
-
- 1 deleted
- 7 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/bmalloc/ChangeLog
r180688 r180693 1 2015-02-26 Geoffrey Garen <ggaren@apple.com> 2 3 bmalloc: Refactored SegregatedFreeList and BoundaryTag::init 4 https://bugs.webkit.org/show_bug.cgi?id=142049 5 6 Reviewed by Anders Carlsson. 7 8 Split out a FreeList class from SegregatedFreeList. This will make it 9 easier to add behaviors on free list insertion and removal -- and it's 10 probably how I should have designed things at the start. 11 12 Moved BoundaryTag::init into LargeObject, since all the related logic 13 lives in LargeObject now too, and this allows us to remove BoundaryTagInlines.h. 14 15 * bmalloc.xcodeproj/project.pbxproj: 16 * bmalloc/BoundaryTagInlines.h: Removed. 17 * bmalloc/FreeList.cpp: Copied from Source/bmalloc/bmalloc/SegregatedFreeList.cpp. 18 (bmalloc::FreeList::takeGreedy): 19 (bmalloc::FreeList::take): 20 (bmalloc::SegregatedFreeList::SegregatedFreeList): Deleted. 21 (bmalloc::SegregatedFreeList::insert): Deleted. 22 (bmalloc::SegregatedFreeList::takeGreedy): Deleted. 23 (bmalloc::SegregatedFreeList::take): Deleted. 24 * bmalloc/FreeList.h: Copied from Source/bmalloc/bmalloc/SegregatedFreeList.h. 25 (bmalloc::FreeList::push): 26 * bmalloc/LargeObject.h: 27 (bmalloc::LargeObject::init): 28 * bmalloc/SegregatedFreeList.cpp: 29 (bmalloc::SegregatedFreeList::SegregatedFreeList): 30 (bmalloc::SegregatedFreeList::insert): 31 (bmalloc::SegregatedFreeList::takeGreedy): 32 (bmalloc::SegregatedFreeList::take): 33 * bmalloc/SegregatedFreeList.h: 34 * bmalloc/Sizes.h: 35 * bmalloc/VMHeap.cpp: 36 (bmalloc::VMHeap::grow): 37 1 38 2015-02-26 Geoffrey Garen <ggaren@apple.com> 2 39 -
trunk/Source/bmalloc/bmalloc.xcodeproj/project.pbxproj
r180576 r180693 10 10 1400274918F89C1300115C97 /* Heap.h in Headers */ = {isa = PBXBuildFile; fileRef = 14DA320C18875B09007269E0 /* Heap.h */; settings = {ATTRIBUTES = (Private, ); }; }; 11 11 1400274A18F89C2300115C97 /* VMHeap.h in Headers */ = {isa = PBXBuildFile; fileRef = 144F7BFC18BFC517003537F3 /* VMHeap.h */; settings = {ATTRIBUTES = (Private, ); }; }; 12 1400274B18F89C3D00115C97 /* BoundaryTagInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 14105E7B18DBD7AF003A106E /* BoundaryTagInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };13 12 1400274C18F89C3D00115C97 /* SegregatedFreeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 146BEE1E18C841C50002D5A2 /* SegregatedFreeList.h */; settings = {ATTRIBUTES = (Private, ); }; }; 14 13 140FA00319CE429C00FFD3C8 /* BumpRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 140FA00219CE429C00FFD3C8 /* BumpRange.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 16 15 143CB81C19022BC900B16A45 /* StaticMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 143CB81A19022BC900B16A45 /* StaticMutex.cpp */; }; 17 16 143CB81D19022BC900B16A45 /* StaticMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 143CB81B19022BC900B16A45 /* StaticMutex.h */; settings = {ATTRIBUTES = (Private, ); }; }; 17 143EF9AF1A9FABF6004F5C77 /* FreeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 143EF9AD1A9FABF6004F5C77 /* FreeList.cpp */; }; 18 143EF9B01A9FABF6004F5C77 /* FreeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 143EF9AE1A9FABF6004F5C77 /* FreeList.h */; }; 18 19 1440AFC91A95142400837FAA /* SuperChunk.h in Headers */ = {isa = PBXBuildFile; fileRef = 1440AFC81A95142400837FAA /* SuperChunk.h */; settings = {ATTRIBUTES = (Private, ); }; }; 19 20 1440AFCB1A95261100837FAA /* Zone.h in Headers */ = {isa = PBXBuildFile; fileRef = 1440AFCA1A95261100837FAA /* Zone.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 81 82 140FA00219CE429C00FFD3C8 /* BumpRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BumpRange.h; path = bmalloc/BumpRange.h; sourceTree = "<group>"; }; 82 83 140FA00419CE4B6800FFD3C8 /* LineMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LineMetadata.h; path = bmalloc/LineMetadata.h; sourceTree = "<group>"; }; 83 14105E7B18DBD7AF003A106E /* BoundaryTagInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BoundaryTagInlines.h; path = bmalloc/BoundaryTagInlines.h; sourceTree = "<group>"; };84 84 14105E8318E14374003A106E /* ObjectType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ObjectType.cpp; path = bmalloc/ObjectType.cpp; sourceTree = "<group>"; }; 85 85 1413E460189DCE1E00546D68 /* Inline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Inline.h; path = bmalloc/Inline.h; sourceTree = "<group>"; }; … … 95 95 143E29E918CAE8BE00FE8A0F /* MediumPage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediumPage.h; path = bmalloc/MediumPage.h; sourceTree = "<group>"; }; 96 96 143E29ED18CAE90500FE8A0F /* SmallPage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SmallPage.h; path = bmalloc/SmallPage.h; sourceTree = "<group>"; }; 97 143EF9AD1A9FABF6004F5C77 /* FreeList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FreeList.cpp; path = bmalloc/FreeList.cpp; sourceTree = "<group>"; }; 98 143EF9AE1A9FABF6004F5C77 /* FreeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FreeList.h; path = bmalloc/FreeList.h; sourceTree = "<group>"; }; 97 99 1440AFC81A95142400837FAA /* SuperChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SuperChunk.h; path = bmalloc/SuperChunk.h; sourceTree = "<group>"; }; 98 100 1440AFCA1A95261100837FAA /* Zone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Zone.h; path = bmalloc/Zone.h; sourceTree = "<group>"; }; … … 218 220 1417F64518B54A700076FA3F /* BeginTag.h */, 219 221 1485655E18A43AF900ED6942 /* BoundaryTag.h */, 220 14105E7B18DBD7AF003A106E /* BoundaryTagInlines.h */,221 222 1417F64618B54A700076FA3F /* EndTag.h */, 223 143EF9AD1A9FABF6004F5C77 /* FreeList.cpp */, 224 143EF9AE1A9FABF6004F5C77 /* FreeList.h */, 222 225 147AAA8818CD17CE002201E4 /* LargeChunk.h */, 223 226 14C6216E1A9A9A6200E72293 /* LargeObject.h */, … … 335 338 14DD78D018F48D7500950702 /* VMAllocate.h in Headers */, 336 339 1440AFC91A95142400837FAA /* SuperChunk.h in Headers */, 340 143EF9B01A9FABF6004F5C77 /* FreeList.h in Headers */, 337 341 14DD78CE18F48D7500950702 /* Syscall.h in Headers */, 338 342 14DD78C618F48D7500950702 /* AsyncTask.h in Headers */, … … 347 351 14DD78C518F48D7500950702 /* Algorithm.h in Headers */, 348 352 14DD78BD18F48D6B00950702 /* SmallPage.h in Headers */, 349 1400274B18F89C3D00115C97 /* BoundaryTagInlines.h in Headers */,350 353 14DD788E18F48CCD00950702 /* BoundaryTag.h in Headers */, 351 354 14DD78C818F48D7500950702 /* FixedVector.h in Headers */, … … 440 443 14F271C318EA3978008C152F /* Allocator.cpp in Sources */, 441 444 14895D911A3A319C0006235D /* Environment.cpp in Sources */, 445 143EF9AF1A9FABF6004F5C77 /* FreeList.cpp in Sources */, 442 446 14F271C718EA3990008C152F /* Heap.cpp in Sources */, 443 447 14F271C918EA3990008C152F /* VMHeap.cpp in Sources */, -
trunk/Source/bmalloc/bmalloc/FreeList.cpp
r180686 r180693 26 26 #include "BeginTag.h" 27 27 #include "LargeChunk.h" 28 #include " SegregatedFreeList.h"28 #include "FreeList.h" 29 29 #include "Vector.h" 30 30 31 31 namespace bmalloc { 32 32 33 SegregatedFreeList::SegregatedFreeList()33 LargeObject FreeList::takeGreedy(size_t size) 34 34 { 35 BASSERT(static_cast<size_t>(&select(largeMax) - m_lists.begin()) == m_lists.size() - 1); 36 } 37 38 void SegregatedFreeList::insert(const LargeObject& largeObject) 39 { 40 BASSERT(largeObject.isFree()); 41 auto& list = select(largeObject.size()); 42 list.push(largeObject.range()); 43 } 44 45 LargeObject SegregatedFreeList::takeGreedy(size_t size) 46 { 47 for (size_t i = m_lists.size(); i-- > 0; ) { 48 LargeObject largeObject = takeGreedy(m_lists[i], size); 49 if (!largeObject) 50 continue; 51 52 return largeObject; 53 } 54 return LargeObject(); 55 } 56 57 LargeObject SegregatedFreeList::takeGreedy(List& list, size_t size) 58 { 59 for (size_t i = list.size(); i-- > 0; ) { 35 for (size_t i = m_vector.size(); i-- > 0; ) { 60 36 // We don't eagerly remove items when we merge and/or split ranges, 61 37 // so we need to validate each free list entry before using it. 62 LargeObject largeObject(LargeObject::DoNotValidate, list[i].begin());63 if (!largeObject.isValidAndFree( list[i].size())) {64 list.pop(i);38 LargeObject largeObject(LargeObject::DoNotValidate, m_vector[i].begin()); 39 if (!largeObject.isValidAndFree(m_vector[i].size())) { 40 m_vector.pop(i); 65 41 continue; 66 42 } … … 69 45 continue; 70 46 71 list.pop(i);47 m_vector.pop(i); 72 48 return largeObject; 73 49 } … … 76 52 } 77 53 78 LargeObject SegregatedFreeList::take(size_t size) 79 { 80 for (auto* list = &select(size); list != m_lists.end(); ++list) { 81 LargeObject largeObject = take(*list, size); 82 if (!largeObject) 83 continue; 84 85 return largeObject; 86 } 87 return LargeObject(); 88 } 89 90 LargeObject SegregatedFreeList::take(size_t alignment, size_t size, size_t unalignedSize) 91 { 92 for (auto* list = &select(size); list != m_lists.end(); ++list) { 93 LargeObject largeObject = take(*list, alignment, size, unalignedSize); 94 if (!largeObject) 95 continue; 96 97 return largeObject; 98 } 99 return LargeObject(); 100 } 101 102 INLINE auto SegregatedFreeList::select(size_t size) -> List& 103 { 104 size_t alignCount = (size - largeMin) / largeAlignment; 105 size_t result = 0; 106 while (alignCount) { 107 ++result; 108 alignCount >>= 1; 109 } 110 return m_lists[result]; 111 } 112 113 INLINE LargeObject SegregatedFreeList::take(List& list, size_t size) 54 LargeObject FreeList::take(size_t size) 114 55 { 115 56 LargeObject first; 116 size_t end = list.size() > segregatedFreeListSearchDepth ? list.size() - segregatedFreeListSearchDepth : 0;117 for (size_t i = list.size(); i-- > end; ) {57 size_t end = m_vector.size() > freeListSearchDepth ? m_vector.size() - freeListSearchDepth : 0; 58 for (size_t i = m_vector.size(); i-- > end; ) { 118 59 // We don't eagerly remove items when we merge and/or split ranges, so 119 60 // we need to validate each free list entry before using it. 120 LargeObject largeObject(LargeObject::DoNotValidate, list[i].begin());121 if (!largeObject.isValidAndFree( list[i].size())) {122 list.pop(i);61 LargeObject largeObject(LargeObject::DoNotValidate, m_vector[i].begin()); 62 if (!largeObject.isValidAndFree(m_vector[i].size())) { 63 m_vector.pop(i); 123 64 continue; 124 65 } … … 136 77 } 137 78 138 INLINE LargeObject SegregatedFreeList::take(List& list,size_t alignment, size_t size, size_t unalignedSize)79 LargeObject FreeList::take(size_t alignment, size_t size, size_t unalignedSize) 139 80 { 140 81 BASSERT(isPowerOfTwo(alignment)); … … 142 83 143 84 LargeObject first; 144 size_t end = list.size() > segregatedFreeListSearchDepth ? list.size() - segregatedFreeListSearchDepth : 0;145 for (size_t i = list.size(); i-- > end; ) {85 size_t end = m_vector.size() > freeListSearchDepth ? m_vector.size() - freeListSearchDepth : 0; 86 for (size_t i = m_vector.size(); i-- > end; ) { 146 87 // We don't eagerly remove items when we merge and/or split ranges, so 147 88 // we need to validate each free list entry before using it. 148 LargeObject largeObject(LargeObject::DoNotValidate, list[i].begin());149 if (!largeObject.isValidAndFree( list[i].size())) {150 list.pop(i);89 LargeObject largeObject(LargeObject::DoNotValidate, m_vector[i].begin()); 90 if (!largeObject.isValidAndFree(m_vector[i].size())) { 91 m_vector.pop(i); 151 92 continue; 152 93 } -
trunk/Source/bmalloc/bmalloc/FreeList.h
r180686 r180693 24 24 */ 25 25 26 #ifndef SegregatedFreeList_h27 #define SegregatedFreeList_h26 #ifndef FreeList_h 27 #define FreeList_h 28 28 29 29 #include "LargeObject.h" 30 30 #include "Vector.h" 31 #include <array>32 31 33 32 namespace bmalloc { 34 33 35 class SegregatedFreeList { 34 // Helper object for SegregatedFreeList. 35 36 class FreeList { 36 37 public: 37 SegregatedFreeList();38 void push(const LargeObject&); 38 39 39 void insert(const LargeObject&);40 41 // Returns a reasonable fit for the provided size, or LargeObject() if no fit42 // is found. May return LargeObject() spuriously if searching takes too long.43 // Incrementally removes stale items from the free list while searching.44 // Does not eagerly remove the returned object from the free list.45 40 LargeObject take(size_t); 46 47 // Returns a reasonable fit for the provided alignment and size, or48 // a reasonable fit for the provided unaligned size, or LargeObject() if no49 // fit is found. May return LargeObject() spuriously if searching takes too50 // long. Incrementally removes stale items from the free list while51 // searching. Does not eagerly remove the returned object from the free list.52 41 LargeObject take(size_t alignment, size_t, size_t unalignedSize); 53 54 // Returns an unreasonable fit for the provided size, or LargeObject() if no55 // fit is found. Never returns LargeObject() spuriously. Incrementally56 // removes stale items from the free list while searching. Eagerly removes57 // the returned object from the free list.58 42 LargeObject takeGreedy(size_t); 59 43 60 44 private: 61 typedef Vector<Range> List; 45 Vector<Range> m_vector; 46 }; 62 47 63 List& select(size_t); 64 LargeObject take(List&, size_t); 65 LargeObject take(List&, size_t alignment, size_t, size_t unalignedSize); 66 LargeObject takeGreedy(List&, size_t); 67 68 std::array<List, 19> m_lists; 69 }; 48 inline void FreeList::push(const LargeObject& largeObject) 49 { 50 BASSERT(largeObject.isFree()); 51 m_vector.push(largeObject.range()); 52 } 70 53 71 54 } // namespace bmalloc 72 55 73 #endif // SegregatedFreeList_h56 #endif // FreeList_h -
trunk/Source/bmalloc/bmalloc/LargeObject.h
r180576 r180693 30 30 #include "EndTag.h" 31 31 #include "LargeChunk.h" 32 #include "Range.h" 32 33 33 34 namespace bmalloc { … … 35 36 class LargeObject { 36 37 public: 38 static Range init(LargeChunk*); 39 37 40 LargeObject(); 38 41 LargeObject(void*); … … 238 241 } 239 242 243 inline Range LargeObject::init(LargeChunk* chunk) 244 { 245 Range range(chunk->begin(), chunk->end() - chunk->begin()); 246 247 BeginTag* beginTag = LargeChunk::beginTag(range.begin()); 248 beginTag->setRange(range); 249 beginTag->setFree(true); 250 beginTag->setHasPhysicalPages(false); 251 252 EndTag* endTag = LargeChunk::endTag(range.begin(), range.size()); 253 endTag->init(beginTag); 254 255 // Mark the left and right edges of our chunk as allocated. This naturally 256 // prevents merging logic from overflowing beyond our chunk, without requiring 257 // special-case checks. 258 259 EndTag* leftSentinel = beginTag->prev(); 260 BASSERT(leftSentinel >= static_cast<void*>(chunk)); 261 leftSentinel->initSentinel(); 262 263 BeginTag* rightSentinel = endTag->next(); 264 BASSERT(rightSentinel < static_cast<void*>(range.begin())); 265 rightSentinel->initSentinel(); 266 267 return range; 268 } 269 240 270 } // namespace bmalloc 241 271 -
trunk/Source/bmalloc/bmalloc/SegregatedFreeList.cpp
r180576 r180693 24 24 */ 25 25 26 #include "BeginTag.h"27 #include "LargeChunk.h"28 26 #include "SegregatedFreeList.h" 29 #include "Vector.h"30 27 31 28 namespace bmalloc { … … 33 30 SegregatedFreeList::SegregatedFreeList() 34 31 { 35 BASSERT(static_cast<size_t>(&select(largeMax) - m_ lists.begin()) == m_lists.size() - 1);32 BASSERT(static_cast<size_t>(&select(largeMax) - m_freeLists.begin()) == m_freeLists.size() - 1); 36 33 } 37 34 38 35 void SegregatedFreeList::insert(const LargeObject& largeObject) 39 36 { 40 BASSERT(largeObject.isFree());41 37 auto& list = select(largeObject.size()); 42 list.push(largeObject .range());38 list.push(largeObject); 43 39 } 44 40 45 41 LargeObject SegregatedFreeList::takeGreedy(size_t size) 46 42 { 47 for (size_t i = m_ lists.size(); i-- > 0; ) {48 LargeObject largeObject = takeGreedy(m_lists[i],size);43 for (size_t i = m_freeLists.size(); i-- > 0; ) { 44 LargeObject largeObject = m_freeLists[i].takeGreedy(size); 49 45 if (!largeObject) 50 46 continue; … … 55 51 } 56 52 57 LargeObject SegregatedFreeList::takeGreedy(List& list, size_t size)58 {59 for (size_t i = list.size(); i-- > 0; ) {60 // We don't eagerly remove items when we merge and/or split ranges,61 // so we need to validate each free list entry before using it.62 LargeObject largeObject(LargeObject::DoNotValidate, list[i].begin());63 if (!largeObject.isValidAndFree(list[i].size())) {64 list.pop(i);65 continue;66 }67 68 if (largeObject.size() < size)69 continue;70 71 list.pop(i);72 return largeObject;73 }74 75 return LargeObject();76 }77 78 53 LargeObject SegregatedFreeList::take(size_t size) 79 54 { 80 for (auto* list = &select(size); list != m_ lists.end(); ++list) {81 LargeObject largeObject = take(*list,size);55 for (auto* list = &select(size); list != m_freeLists.end(); ++list) { 56 LargeObject largeObject = list->take(size); 82 57 if (!largeObject) 83 58 continue; … … 90 65 LargeObject SegregatedFreeList::take(size_t alignment, size_t size, size_t unalignedSize) 91 66 { 92 for (auto* list = &select(size); list != m_ lists.end(); ++list) {93 LargeObject largeObject = take(*list,alignment, size, unalignedSize);67 for (auto* list = &select(size); list != m_freeLists.end(); ++list) { 68 LargeObject largeObject = list->take(alignment, size, unalignedSize); 94 69 if (!largeObject) 95 70 continue; … … 100 75 } 101 76 102 INLINE auto SegregatedFreeList::select(size_t size) -> List&77 INLINE auto SegregatedFreeList::select(size_t size) -> FreeList& 103 78 { 104 79 size_t alignCount = (size - largeMin) / largeAlignment; … … 108 83 alignCount >>= 1; 109 84 } 110 return m_lists[result]; 111 } 112 113 INLINE LargeObject SegregatedFreeList::take(List& list, size_t size) 114 { 115 LargeObject first; 116 size_t end = list.size() > segregatedFreeListSearchDepth ? list.size() - segregatedFreeListSearchDepth : 0; 117 for (size_t i = list.size(); i-- > end; ) { 118 // We don't eagerly remove items when we merge and/or split ranges, so 119 // we need to validate each free list entry before using it. 120 LargeObject largeObject(LargeObject::DoNotValidate, list[i].begin()); 121 if (!largeObject.isValidAndFree(list[i].size())) { 122 list.pop(i); 123 continue; 124 } 125 126 if (largeObject.size() < size) 127 continue; 128 129 if (!!first && first.begin() < largeObject.begin()) 130 continue; 131 132 first = largeObject; 133 } 134 135 return first; 136 } 137 138 INLINE LargeObject SegregatedFreeList::take(List& list, size_t alignment, size_t size, size_t unalignedSize) 139 { 140 BASSERT(isPowerOfTwo(alignment)); 141 size_t alignmentMask = alignment - 1; 142 143 LargeObject first; 144 size_t end = list.size() > segregatedFreeListSearchDepth ? list.size() - segregatedFreeListSearchDepth : 0; 145 for (size_t i = list.size(); i-- > end; ) { 146 // We don't eagerly remove items when we merge and/or split ranges, so 147 // we need to validate each free list entry before using it. 148 LargeObject largeObject(LargeObject::DoNotValidate, list[i].begin()); 149 if (!largeObject.isValidAndFree(list[i].size())) { 150 list.pop(i); 151 continue; 152 } 153 154 if (largeObject.size() < size) 155 continue; 156 157 if (test(largeObject.begin(), alignmentMask) && largeObject.size() < unalignedSize) 158 continue; 159 160 if (!!first && first.begin() < largeObject.begin()) 161 continue; 162 163 first = largeObject; 164 } 165 166 return first; 85 return m_freeLists[result]; 167 86 } 168 87 -
trunk/Source/bmalloc/bmalloc/SegregatedFreeList.h
r180576 r180693 27 27 #define SegregatedFreeList_h 28 28 29 #include "LargeObject.h" 30 #include "Vector.h" 29 #include "FreeList.h" 31 30 #include <array> 32 31 … … 59 58 60 59 private: 61 typedef Vector<Range> List;60 FreeList& select(size_t); 62 61 63 List& select(size_t); 64 LargeObject take(List&, size_t); 65 LargeObject take(List&, size_t alignment, size_t, size_t unalignedSize); 66 LargeObject takeGreedy(List&, size_t); 67 68 std::array<List, 19> m_lists; 62 std::array<FreeList, 19> m_freeLists; 69 63 }; 70 64 -
trunk/Source/bmalloc/bmalloc/Sizes.h
r180688 r180693 82 82 static const size_t xLargeAlignment = vmPageSize; 83 83 84 static const size_t segregatedFreeListSearchDepth = 16;84 static const size_t freeListSearchDepth = 16; 85 85 86 86 static const uintptr_t typeMask = (superChunkSize - 1) & ~((superChunkSize / 4) - 1); // 4 taggable chunks -
trunk/Source/bmalloc/bmalloc/VMHeap.cpp
r180604 r180693 24 24 */ 25 25 26 #include "BoundaryTagInlines.h" 27 #include "LargeChunk.h" 26 #include "LargeObject.h" 28 27 #include "Line.h" 29 28 #include "PerProcess.h" … … 54 53 55 54 LargeChunk* largeChunk = superChunk->largeChunk(); 56 m_largeObjects.insert(LargeObject( BoundaryTag::init(largeChunk).begin()));55 m_largeObjects.insert(LargeObject(LargeObject::init(largeChunk).begin())); 57 56 } 58 57
Note: See TracChangeset
for help on using the changeset viewer.