OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project 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 #include "src/heap/spaces.h" | 5 #include "src/heap/spaces.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/base/platform/platform.h" | 8 #include "src/base/platform/platform.h" |
9 #include "src/full-codegen/full-codegen.h" | 9 #include "src/full-codegen/full-codegen.h" |
10 #include "src/heap/slot-set.h" | 10 #include "src/heap/slot-set.h" |
(...skipping 1653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1664 // Properly uncommit memory to keep the allocator counters in sync. | 1664 // Properly uncommit memory to keep the allocator counters in sync. |
1665 if (is_committed()) Uncommit(); | 1665 if (is_committed()) Uncommit(); |
1666 current_capacity_ = maximum_capacity_ = 0; | 1666 current_capacity_ = maximum_capacity_ = 0; |
1667 } | 1667 } |
1668 | 1668 |
1669 | 1669 |
1670 bool SemiSpace::Commit() { | 1670 bool SemiSpace::Commit() { |
1671 DCHECK(!is_committed()); | 1671 DCHECK(!is_committed()); |
1672 NewSpacePage* current = anchor(); | 1672 NewSpacePage* current = anchor(); |
1673 const int num_pages = current_capacity_ / Page::kPageSize; | 1673 const int num_pages = current_capacity_ / Page::kPageSize; |
1674 for (int i = 0; i < num_pages; i++) { | 1674 for (int pages_added = 0; pages_added < num_pages; pages_added++) { |
1675 NewSpacePage* new_page = | 1675 NewSpacePage* new_page = |
1676 heap() | 1676 heap() |
1677 ->memory_allocator() | 1677 ->memory_allocator() |
1678 ->AllocatePage<NewSpacePage, MemoryAllocator::kPooled>( | 1678 ->AllocatePage<NewSpacePage, MemoryAllocator::kPooled>( |
1679 NewSpacePage::kAllocatableMemory, this, executable()); | 1679 NewSpacePage::kAllocatableMemory, this, executable()); |
| 1680 if (new_page == nullptr) { |
| 1681 RewindPages(current, pages_added); |
| 1682 return false; |
| 1683 } |
1680 new_page->InsertAfter(current); | 1684 new_page->InsertAfter(current); |
1681 current = new_page; | 1685 current = new_page; |
1682 } | 1686 } |
1683 Reset(); | 1687 Reset(); |
1684 AccountCommitted(current_capacity_); | 1688 AccountCommitted(current_capacity_); |
1685 if (age_mark_ == nullptr) { | 1689 if (age_mark_ == nullptr) { |
1686 age_mark_ = first_page()->area_start(); | 1690 age_mark_ = first_page()->area_start(); |
1687 } | 1691 } |
1688 committed_ = true; | 1692 committed_ = true; |
1689 return true; | 1693 return true; |
(...skipping 27 matching lines...) Expand all Loading... |
1717 | 1721 |
1718 bool SemiSpace::GrowTo(int new_capacity) { | 1722 bool SemiSpace::GrowTo(int new_capacity) { |
1719 if (!is_committed()) { | 1723 if (!is_committed()) { |
1720 if (!Commit()) return false; | 1724 if (!Commit()) return false; |
1721 } | 1725 } |
1722 DCHECK_EQ(new_capacity & NewSpacePage::kPageAlignmentMask, 0); | 1726 DCHECK_EQ(new_capacity & NewSpacePage::kPageAlignmentMask, 0); |
1723 DCHECK_LE(new_capacity, maximum_capacity_); | 1727 DCHECK_LE(new_capacity, maximum_capacity_); |
1724 DCHECK_GT(new_capacity, current_capacity_); | 1728 DCHECK_GT(new_capacity, current_capacity_); |
1725 const int delta = new_capacity - current_capacity_; | 1729 const int delta = new_capacity - current_capacity_; |
1726 DCHECK(IsAligned(delta, base::OS::AllocateAlignment())); | 1730 DCHECK(IsAligned(delta, base::OS::AllocateAlignment())); |
1727 int delta_pages = delta / NewSpacePage::kPageSize; | 1731 const int delta_pages = delta / NewSpacePage::kPageSize; |
1728 NewSpacePage* last_page = anchor()->prev_page(); | 1732 NewSpacePage* last_page = anchor()->prev_page(); |
1729 DCHECK_NE(last_page, anchor()); | 1733 DCHECK_NE(last_page, anchor()); |
1730 while (delta_pages > 0) { | 1734 for (int pages_added = 0; pages_added < delta_pages; pages_added++) { |
1731 NewSpacePage* new_page = | 1735 NewSpacePage* new_page = |
1732 heap() | 1736 heap() |
1733 ->memory_allocator() | 1737 ->memory_allocator() |
1734 ->AllocatePage<NewSpacePage, MemoryAllocator::kPooled>( | 1738 ->AllocatePage<NewSpacePage, MemoryAllocator::kPooled>( |
1735 NewSpacePage::kAllocatableMemory, this, executable()); | 1739 NewSpacePage::kAllocatableMemory, this, executable()); |
| 1740 if (new_page == nullptr) { |
| 1741 RewindPages(last_page, pages_added); |
| 1742 return false; |
| 1743 } |
1736 new_page->InsertAfter(last_page); | 1744 new_page->InsertAfter(last_page); |
1737 Bitmap::Clear(new_page); | 1745 Bitmap::Clear(new_page); |
1738 // Duplicate the flags that was set on the old page. | 1746 // Duplicate the flags that was set on the old page. |
1739 new_page->SetFlags(last_page->GetFlags(), | 1747 new_page->SetFlags(last_page->GetFlags(), |
1740 NewSpacePage::kCopyOnFlipFlagsMask); | 1748 NewSpacePage::kCopyOnFlipFlagsMask); |
1741 last_page = new_page; | 1749 last_page = new_page; |
1742 delta_pages--; | |
1743 } | 1750 } |
1744 AccountCommitted(static_cast<intptr_t>(delta)); | 1751 AccountCommitted(static_cast<intptr_t>(delta)); |
1745 current_capacity_ = new_capacity; | 1752 current_capacity_ = new_capacity; |
1746 return true; | 1753 return true; |
1747 } | 1754 } |
1748 | 1755 |
| 1756 void SemiSpace::RewindPages(NewSpacePage* start, int num_pages) { |
| 1757 NewSpacePage* new_last_page = nullptr; |
| 1758 NewSpacePage* last_page = start; |
| 1759 while (num_pages > 0) { |
| 1760 DCHECK_NE(last_page, anchor()); |
| 1761 new_last_page = last_page->prev_page(); |
| 1762 last_page->prev_page()->set_next_page(last_page->next_page()); |
| 1763 last_page->next_page()->set_prev_page(last_page->prev_page()); |
| 1764 last_page = new_last_page; |
| 1765 num_pages--; |
| 1766 } |
| 1767 } |
1749 | 1768 |
1750 bool SemiSpace::ShrinkTo(int new_capacity) { | 1769 bool SemiSpace::ShrinkTo(int new_capacity) { |
1751 DCHECK_EQ(new_capacity & NewSpacePage::kPageAlignmentMask, 0); | 1770 DCHECK_EQ(new_capacity & NewSpacePage::kPageAlignmentMask, 0); |
1752 DCHECK_GE(new_capacity, minimum_capacity_); | 1771 DCHECK_GE(new_capacity, minimum_capacity_); |
1753 DCHECK_LT(new_capacity, current_capacity_); | 1772 DCHECK_LT(new_capacity, current_capacity_); |
1754 if (is_committed()) { | 1773 if (is_committed()) { |
1755 const int delta = current_capacity_ - new_capacity; | 1774 const int delta = current_capacity_ - new_capacity; |
1756 DCHECK(IsAligned(delta, base::OS::AllocateAlignment())); | 1775 DCHECK(IsAligned(delta, base::OS::AllocateAlignment())); |
1757 int delta_pages = delta / NewSpacePage::kPageSize; | 1776 int delta_pages = delta / NewSpacePage::kPageSize; |
1758 NewSpacePage* new_last_page; | 1777 NewSpacePage* new_last_page; |
(...skipping 1358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3117 object->ShortPrint(); | 3136 object->ShortPrint(); |
3118 PrintF("\n"); | 3137 PrintF("\n"); |
3119 } | 3138 } |
3120 printf(" --------------------------------------\n"); | 3139 printf(" --------------------------------------\n"); |
3121 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3140 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
3122 } | 3141 } |
3123 | 3142 |
3124 #endif // DEBUG | 3143 #endif // DEBUG |
3125 } // namespace internal | 3144 } // namespace internal |
3126 } // namespace v8 | 3145 } // namespace v8 |
OLD | NEW |