| Index: src/heap/spaces.h
|
| diff --git a/src/heap/spaces.h b/src/heap/spaces.h
|
| index b940a21f4ecf4c1e23c8ff3f395086bda8d7a248..06639366f5f70cf53fd1abdc257b9d3c93b3c678 100644
|
| --- a/src/heap/spaces.h
|
| +++ b/src/heap/spaces.h
|
| @@ -724,12 +724,14 @@ class MemoryChunk {
|
| };
|
|
|
| enum FreeListCategoryType {
|
| + kTiniest,
|
| + kTiny,
|
| kSmall,
|
| kMedium,
|
| kLarge,
|
| kHuge,
|
|
|
| - kFirstCategory = kSmall,
|
| + kFirstCategory = kTiniest,
|
| kLastCategory = kHuge,
|
| kNumberOfCategories = kLastCategory + 1
|
| };
|
| @@ -1650,9 +1652,10 @@ class FreeListCategory {
|
| // categories would scatter allocation more.
|
|
|
| // The free list is organized in categories as follows:
|
| -// 1-31 words (too small): Such small free areas are discarded for efficiency
|
| -// reasons. They can be reclaimed by the compactor. However the distance
|
| -// between top and limit may be this small.
|
| +// kMinBlockSize-10 words (tiniest): The tiniest blocks are only used for
|
| +// allocation, when categories >= small do not have entries anymore.
|
| +// 11-31 words (tiny): The tiny blocks are only used for allocation, when
|
| +// categories >= small do not have entries anymore.
|
| // 32-255 words (small): Used for allocating free space between 1-31 words in
|
| // size.
|
| // 256-2047 words (medium): Used for allocating free space between 32-255 words
|
| @@ -1666,8 +1669,12 @@ class FreeList {
|
| // This method returns how much memory can be allocated after freeing
|
| // maximum_freed memory.
|
| static inline int GuaranteedAllocatable(int maximum_freed) {
|
| - if (maximum_freed <= kSmallListMin) {
|
| + if (maximum_freed <= kTiniestListMax) {
|
| + // Since we are not iterating over all list entries, we cannot guarantee
|
| + // that we can find the maximum freed block in that free list.
|
| return 0;
|
| + } else if (maximum_freed <= kTinyListMax) {
|
| + return kTinyAllocationMax;
|
| } else if (maximum_freed <= kSmallListMax) {
|
| return kSmallAllocationMax;
|
| } else if (maximum_freed <= kMediumListMax) {
|
| @@ -1749,11 +1756,13 @@ class FreeList {
|
| static const int kMinBlockSize = 3 * kPointerSize;
|
| static const int kMaxBlockSize = Page::kAllocatableMemory;
|
|
|
| - static const int kSmallListMin = 0x1f * kPointerSize;
|
| + static const int kTiniestListMax = 0xa * kPointerSize;
|
| + static const int kTinyListMax = 0x1f * kPointerSize;
|
| static const int kSmallListMax = 0xff * kPointerSize;
|
| static const int kMediumListMax = 0x7ff * kPointerSize;
|
| static const int kLargeListMax = 0x3fff * kPointerSize;
|
| - static const int kSmallAllocationMax = kSmallListMin;
|
| + static const int kTinyAllocationMax = kTiniestListMax;
|
| + static const int kSmallAllocationMax = kTinyListMax;
|
| static const int kMediumAllocationMax = kSmallListMax;
|
| static const int kLargeAllocationMax = kMediumListMax;
|
|
|
| @@ -1765,7 +1774,11 @@ class FreeList {
|
| }
|
|
|
| FreeListCategoryType SelectFreeListCategoryType(size_t size_in_bytes) {
|
| - if (size_in_bytes <= kSmallListMax) {
|
| + if (size_in_bytes <= kTiniestListMax) {
|
| + return kTiniest;
|
| + } else if (size_in_bytes <= kTinyListMax) {
|
| + return kTiny;
|
| + } else if (size_in_bytes <= kSmallListMax) {
|
| return kSmall;
|
| } else if (size_in_bytes <= kMediumListMax) {
|
| return kMedium;
|
| @@ -1775,6 +1788,7 @@ class FreeList {
|
| return kHuge;
|
| }
|
|
|
| + // The tiny categories are not used for fast allocation.
|
| FreeListCategoryType SelectFastAllocationFreeListCategoryType(
|
| size_t size_in_bytes) {
|
| if (size_in_bytes <= kSmallAllocationMax) {
|
|
|