| Index: src/spaces.h
|
| diff --git a/src/spaces.h b/src/spaces.h
|
| index 44584ad235abe8f526118504d4450dd4512474cc..b1cfd8b0d73c079dbd224c3170f55ca83ec12c96 100644
|
| --- a/src/spaces.h
|
| +++ b/src/spaces.h
|
| @@ -1347,8 +1347,6 @@ class FreeList BASE_EMBEDDED {
|
| // 'wasted_bytes'. The size should be a non-zero multiple of the word size.
|
| MUST_USE_RESULT HeapObject* Allocate(int size_in_bytes);
|
|
|
| - void MarkNodes();
|
| -
|
| #ifdef DEBUG
|
| void Zap();
|
| static intptr_t SumFreeList(FreeListNode* node);
|
| @@ -1357,7 +1355,20 @@ class FreeList BASE_EMBEDDED {
|
| bool IsVeryLong();
|
| #endif
|
|
|
| - void CountFreeListItems(Page* p, intptr_t* sizes);
|
| + struct SizeStats {
|
| + intptr_t Total() {
|
| + return small_size_ + medium_size_ + large_size_ + huge_size_;
|
| + }
|
| +
|
| + intptr_t small_size_;
|
| + intptr_t medium_size_;
|
| + intptr_t large_size_;
|
| + intptr_t huge_size_;
|
| + };
|
| +
|
| + void CountFreeListItems(Page* p, SizeStats* sizes);
|
| +
|
| + intptr_t EvictFreeListItems(Page* p);
|
|
|
| private:
|
| // The size range of blocks, in bytes.
|
| @@ -1541,9 +1552,8 @@ class PagedSpace : public Space {
|
| !p->WasSweptPrecisely();
|
| }
|
|
|
| - void SetPagesToSweep(Page* first, Page* last) {
|
| + void SetPagesToSweep(Page* first) {
|
| first_unswept_page_ = first;
|
| - last_unswept_page_ = last;
|
| }
|
|
|
| bool AdvanceSweeper(intptr_t bytes_to_sweep);
|
| @@ -1556,16 +1566,18 @@ class PagedSpace : public Space {
|
| Page* LastPage() { return anchor_.prev_page(); }
|
|
|
| bool IsFragmented(Page* p) {
|
| - intptr_t sizes[4];
|
| - free_list_.CountFreeListItems(p, sizes);
|
| + FreeList::SizeStats sizes;
|
| + free_list_.CountFreeListItems(p, &sizes);
|
|
|
| intptr_t ratio;
|
| intptr_t ratio_threshold;
|
| if (identity() == CODE_SPACE) {
|
| - ratio = (sizes[1] * 10 + sizes[2] * 2) * 100 / Page::kObjectAreaSize;
|
| + ratio = (sizes.medium_size_ * 10 + sizes.large_size_ * 2) * 100 /
|
| + Page::kObjectAreaSize;
|
| ratio_threshold = 10;
|
| } else {
|
| - ratio = (sizes[0] * 5 + sizes[1]) * 100 / Page::kObjectAreaSize;
|
| + ratio = (sizes.small_size_ * 5 + sizes.medium_size_) * 100 /
|
| + Page::kObjectAreaSize;
|
| ratio_threshold = 15;
|
| }
|
|
|
| @@ -1573,19 +1585,23 @@ class PagedSpace : public Space {
|
| PrintF("%p [%d]: %d (%.2f%%) %d (%.2f%%) %d (%.2f%%) %d (%.2f%%) %s\n",
|
| reinterpret_cast<void*>(p),
|
| identity(),
|
| - static_cast<int>(sizes[0]),
|
| - static_cast<double>(sizes[0] * 100) / Page::kObjectAreaSize,
|
| - static_cast<int>(sizes[1]),
|
| - static_cast<double>(sizes[1] * 100) / Page::kObjectAreaSize,
|
| - static_cast<int>(sizes[2]),
|
| - static_cast<double>(sizes[2] * 100) / Page::kObjectAreaSize,
|
| - static_cast<int>(sizes[3]),
|
| - static_cast<double>(sizes[3] * 100) / Page::kObjectAreaSize,
|
| + static_cast<int>(sizes.small_size_),
|
| + static_cast<double>(sizes.small_size_ * 100) /
|
| + Page::kObjectAreaSize,
|
| + static_cast<int>(sizes.medium_size_),
|
| + static_cast<double>(sizes.medium_size_ * 100) /
|
| + Page::kObjectAreaSize,
|
| + static_cast<int>(sizes.large_size_),
|
| + static_cast<double>(sizes.large_size_ * 100) /
|
| + Page::kObjectAreaSize,
|
| + static_cast<int>(sizes.huge_size_),
|
| + static_cast<double>(sizes.huge_size_ * 100) /
|
| + Page::kObjectAreaSize,
|
| (ratio > ratio_threshold) ? "[fragmented]" : "");
|
| }
|
|
|
| return (ratio > ratio_threshold) ||
|
| - (FLAG_always_compact && sizes[3] != Page::kObjectAreaSize);
|
| + (FLAG_always_compact && sizes.Total() != Page::kObjectAreaSize);
|
| }
|
|
|
| void EvictEvacuationCandidatesFromFreeLists();
|
| @@ -1617,7 +1633,6 @@ class PagedSpace : public Space {
|
| bool was_swept_conservatively_;
|
|
|
| Page* first_unswept_page_;
|
| - Page* last_unswept_page_;
|
|
|
| // Expands the space by allocating a fixed number of pages. Returns false if
|
| // it cannot allocate requested number of pages from OS.
|
| @@ -2334,8 +2349,6 @@ class FixedSpace : public PagedSpace {
|
| // Prepares for a mark-compact GC.
|
| virtual void PrepareForMarkCompact();
|
|
|
| - void MarkFreeListNodes() { free_list_.MarkNodes(); }
|
| -
|
| protected:
|
| void ResetFreeList() {
|
| free_list_.Reset();
|
|
|