| Index: src/heap/spaces.cc
|
| diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc
|
| index 05eb239f048cad98093781f36a39cfa1cf5fd97c..c3ff8b41647f037b6710c29e20d09c99b3ba2be2 100644
|
| --- a/src/heap/spaces.cc
|
| +++ b/src/heap/spaces.cc
|
| @@ -2296,14 +2296,10 @@ void FreeListCategory::RepairFreeList(Heap* heap) {
|
| }
|
| }
|
|
|
| -
|
| -FreeList::FreeList(PagedSpace* owner)
|
| - : owner_(owner),
|
| - wasted_bytes_(0),
|
| - small_list_(this, kSmall),
|
| - medium_list_(this, kMedium),
|
| - large_list_(this, kLarge),
|
| - huge_list_(this, kHuge) {
|
| +FreeList::FreeList(PagedSpace* owner) : owner_(owner), wasted_bytes_(0) {
|
| + for (int i = kFirstCategory; i < kNumberOfCategories; i++) {
|
| + category_[i].Initialize(this, static_cast<FreeListCategoryType>(i));
|
| + }
|
| Reset();
|
| }
|
|
|
| @@ -2323,10 +2319,10 @@ intptr_t FreeList::Concatenate(FreeList* other) {
|
| wasted_bytes_ += wasted_bytes;
|
| other->wasted_bytes_ = 0;
|
|
|
| - usable_bytes += small_list_.Concatenate(other->GetFreeListCategory(kSmall));
|
| - usable_bytes += medium_list_.Concatenate(other->GetFreeListCategory(kMedium));
|
| - usable_bytes += large_list_.Concatenate(other->GetFreeListCategory(kLarge));
|
| - usable_bytes += huge_list_.Concatenate(other->GetFreeListCategory(kHuge));
|
| + for (int i = kFirstCategory; i < kNumberOfCategories; i++) {
|
| + usable_bytes += category_[i].Concatenate(
|
| + other->GetFreeListCategory(static_cast<FreeListCategoryType>(i)));
|
| + }
|
|
|
| if (!other->owner()->is_local()) other->mutex()->Unlock();
|
| if (!owner()->is_local()) mutex_.Unlock();
|
| @@ -2335,10 +2331,9 @@ intptr_t FreeList::Concatenate(FreeList* other) {
|
|
|
|
|
| void FreeList::Reset() {
|
| - small_list_.Reset();
|
| - medium_list_.Reset();
|
| - large_list_.Reset();
|
| - huge_list_.Reset();
|
| + for (int i = kFirstCategory; i < kNumberOfCategories; i++) {
|
| + category_[i].Reset();
|
| + }
|
| ResetStats();
|
| }
|
|
|
| @@ -2361,16 +2356,16 @@ int FreeList::Free(Address start, int size_in_bytes) {
|
| // Insert other blocks at the head of a free list of the appropriate
|
| // magnitude.
|
| if (size_in_bytes <= kSmallListMax) {
|
| - small_list_.Free(free_space, size_in_bytes);
|
| + category_[kSmall].Free(free_space, size_in_bytes);
|
| page->add_available_in_small_free_list(size_in_bytes);
|
| } else if (size_in_bytes <= kMediumListMax) {
|
| - medium_list_.Free(free_space, size_in_bytes);
|
| + category_[kMedium].Free(free_space, size_in_bytes);
|
| page->add_available_in_medium_free_list(size_in_bytes);
|
| } else if (size_in_bytes <= kLargeListMax) {
|
| - large_list_.Free(free_space, size_in_bytes);
|
| + category_[kLarge].Free(free_space, size_in_bytes);
|
| page->add_available_in_large_free_list(size_in_bytes);
|
| } else {
|
| - huge_list_.Free(free_space, size_in_bytes);
|
| + category_[kHuge].Free(free_space, size_in_bytes);
|
| page->add_available_in_huge_free_list(size_in_bytes);
|
| }
|
|
|
| @@ -2409,7 +2404,7 @@ FreeSpace* FreeList::FindNodeFor(int size_in_bytes, int* node_size) {
|
| if (node != nullptr) return node;
|
| }
|
|
|
| - node = huge_list_.SearchForNodeInList(size_in_bytes, node_size);
|
| + node = category_[kHuge].SearchForNodeInList(size_in_bytes, node_size);
|
| if (node != nullptr) {
|
| page = Page::FromAddress(node->address());
|
| page->add_available_in_large_free_list(-(*node_size));
|
| @@ -2418,21 +2413,21 @@ FreeSpace* FreeList::FindNodeFor(int size_in_bytes, int* node_size) {
|
| }
|
|
|
| if (size_in_bytes <= kSmallListMax) {
|
| - node = small_list_.PickNodeFromList(size_in_bytes, node_size);
|
| + node = category_[kSmall].PickNodeFromList(size_in_bytes, node_size);
|
| if (node != NULL) {
|
| DCHECK(size_in_bytes <= *node_size);
|
| page = Page::FromAddress(node->address());
|
| page->add_available_in_small_free_list(-(*node_size));
|
| }
|
| } else if (size_in_bytes <= kMediumListMax) {
|
| - node = medium_list_.PickNodeFromList(size_in_bytes, node_size);
|
| + node = category_[kMedium].PickNodeFromList(size_in_bytes, node_size);
|
| if (node != NULL) {
|
| DCHECK(size_in_bytes <= *node_size);
|
| page = Page::FromAddress(node->address());
|
| page->add_available_in_medium_free_list(-(*node_size));
|
| }
|
| } else if (size_in_bytes <= kLargeListMax) {
|
| - node = large_list_.PickNodeFromList(size_in_bytes, node_size);
|
| + node = category_[kLarge].PickNodeFromList(size_in_bytes, node_size);
|
| if (node != NULL) {
|
| DCHECK(size_in_bytes <= *node_size);
|
| page = Page::FromAddress(node->address());
|
| @@ -2550,29 +2545,30 @@ HeapObject* FreeList::Allocate(int size_in_bytes) {
|
|
|
|
|
| intptr_t FreeList::EvictFreeListItems(Page* p) {
|
| - intptr_t sum = huge_list_.EvictFreeListItemsInList(p);
|
| + intptr_t sum = category_[kHuge].EvictFreeListItemsInList(p);
|
| if (sum < p->area_size()) {
|
| - sum += small_list_.EvictFreeListItemsInList(p) +
|
| - medium_list_.EvictFreeListItemsInList(p) +
|
| - large_list_.EvictFreeListItemsInList(p);
|
| + for (int i = kFirstCategory; i <= kLarge; i++) {
|
| + sum += category_[i].EvictFreeListItemsInList(p);
|
| + }
|
| }
|
| return sum;
|
| }
|
|
|
|
|
| bool FreeList::ContainsPageFreeListItems(Page* p) {
|
| - return huge_list_.EvictFreeListItemsInList(p) ||
|
| - small_list_.EvictFreeListItemsInList(p) ||
|
| - medium_list_.EvictFreeListItemsInList(p) ||
|
| - large_list_.EvictFreeListItemsInList(p);
|
| + for (int i = kFirstCategory; i < kNumberOfCategories; i++) {
|
| + if (category_[i].EvictFreeListItemsInList(p)) {
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| }
|
|
|
|
|
| void FreeList::RepairLists(Heap* heap) {
|
| - small_list_.RepairFreeList(heap);
|
| - medium_list_.RepairFreeList(heap);
|
| - large_list_.RepairFreeList(heap);
|
| - huge_list_.RepairFreeList(heap);
|
| + for (int i = kFirstCategory; i < kNumberOfCategories; i++) {
|
| + category_[i].RepairFreeList(heap);
|
| + }
|
| }
|
|
|
|
|
| @@ -2607,8 +2603,12 @@ bool FreeListCategory::IsVeryLong() {
|
|
|
|
|
| bool FreeList::IsVeryLong() {
|
| - return small_list_.IsVeryLong() || medium_list_.IsVeryLong() ||
|
| - large_list_.IsVeryLong() || huge_list_.IsVeryLong();
|
| + for (int i = kFirstCategory; i < kNumberOfCategories; i++) {
|
| + if (category_[i].IsVeryLong()) {
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| }
|
|
|
|
|
| @@ -2616,10 +2616,10 @@ bool FreeList::IsVeryLong() {
|
| // on the free list, so it should not be called if FreeListLength returns
|
| // kVeryLongFreeList.
|
| intptr_t FreeList::SumFreeLists() {
|
| - intptr_t sum = small_list_.SumFreeList();
|
| - sum += medium_list_.SumFreeList();
|
| - sum += large_list_.SumFreeList();
|
| - sum += huge_list_.SumFreeList();
|
| + intptr_t sum = 0;
|
| + for (int i = kFirstCategory; i < kNumberOfCategories; i++) {
|
| + sum += category_[i].SumFreeList();
|
| + }
|
| return sum;
|
| }
|
| #endif
|
|
|